diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm
index aa0d9d616d..e6f072ca0c 100644
--- a/code/__defines/belly_modes_vr.dm
+++ b/code/__defines/belly_modes_vr.dm
@@ -1,28 +1,38 @@
-// Belly Mode Constants
+// Normal digestion modes
#define DM_HOLD "Hold"
-#define DM_DIGEST "Digest"
-#define DM_ITEMWEAK "Digest (Item Friendly)"
-#define DM_STRIPDIGEST "Strip Digest (Items Only)"
-#define DM_DIGEST_NUMB "Digest (Numbing)"
+#define DM_DIGEST "Digest"
+#define DM_ABSORB "Absorb"
+#define DM_UNABSORB "Unabsorb"
+#define DM_DRAIN "Drain"
+#define DM_SHRINK "Shrink"
+#define DM_GROW "Grow"
+#define DM_SIZE_STEAL "Size Steal"
#define DM_HEAL "Heal"
-#define DM_ABSORB "Absorb"
+#define DM_EGG "Encase In Egg"
+#define DM_TRANSFORM "Transform"
+
+//#define DM_ITEMWEAK "Digest (Item Friendly)"
+//#define DM_STRIPDIGEST "Strip Digest (Items Only)"
+//#define DM_DIGEST_NUMB "Digest (Numbing)"
+
+//TF modes
#define DM_TRANSFORM_HAIR_AND_EYES "Transform (Hair and eyes)"
#define DM_TRANSFORM_MALE "Transform (Male)"
-#define DM_TRANSFORM_FEMALE "Transform (Female)"
+#define DM_TRANSFORM_FEMALE "Transform (Female)"
#define DM_TRANSFORM_KEEP_GENDER "Transform (Keep Gender)"
#define DM_TRANSFORM_REPLICA "Transform (Replica Of Self)"
#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR "Transform (Change Species and Taur)"
-#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG "Transform (Change Species and Taur) (EGG)"
+#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG "Transform (Change Species and Taur) (EGG)"
#define DM_TRANSFORM_REPLICA_EGG "Transform (Replica Of Self) (EGG)"
#define DM_TRANSFORM_KEEP_GENDER_EGG "Transform (Keep Gender) (EGG)"
#define DM_TRANSFORM_MALE_EGG "Transform (Male) (EGG)"
-#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)"
-#define DM_EGG "Encase In Egg"
-#define DM_DRAIN "Drain"
-#define DM_UNABSORB "Unabsorb"
-#define DM_SHRINK "Shrink"
-#define DM_GROW "Grow"
-#define DM_SIZE_STEAL "Size Steal"
+#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
+
// Stance for hostile mobs to be in while devouring someone.
#define HOSTILE_STANCE_EATING 99
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 92ad017cd2..e26724ae5b 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -1223,20 +1223,21 @@ proc/is_hot(obj/item/W as obj)
/*
Checks if that loc and dir has a item on the wall
+TODO - Fix this ancient list of wall items. Preferably make it dynamically populated. ~Leshana
*/
var/list/WALLITEMS = list(
- "/obj/machinery/power/apc", "/obj/machinery/alarm", "/obj/item/device/radio/intercom",
- "/obj/structure/extinguisher_cabinet", "/obj/structure/reagent_dispensers/peppertank",
- "/obj/machinery/status_display", "/obj/machinery/requests_console", "/obj/machinery/light_switch", "/obj/effect/sign",
- "/obj/machinery/newscaster", "/obj/machinery/firealarm", "/obj/structure/noticeboard", "/obj/machinery/door_control",
- "/obj/machinery/computer/security/telescreen", "/obj/machinery/embedded_controller/radio/simple_vent_controller",
- "/obj/item/weapon/storage/secure/safe", "/obj/machinery/door_timer", "/obj/machinery/flasher", "/obj/machinery/keycard_auth",
- "/obj/structure/mirror", "/obj/structure/closet/fireaxecabinet", "/obj/machinery/computer/security/telescreen/entertainment"
+ /obj/machinery/power/apc, /obj/machinery/alarm, /obj/item/device/radio/intercom, /obj/structure/frame,
+ /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank,
+ /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign,
+ /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/button/remote,
+ /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio,
+ /obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth,
+ /obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment
)
/proc/gotwallitem(loc, dir)
for(var/obj/O in loc)
for(var/item in WALLITEMS)
- if(istype(O, text2path(item)))
+ if(istype(O, item))
//Direction works sometimes
if(O.dir == dir)
return 1
@@ -1260,7 +1261,7 @@ var/list/WALLITEMS = list(
//Some stuff is placed directly on the wallturf (signs)
for(var/obj/O in get_step(loc, dir))
for(var/item in WALLITEMS)
- if(istype(O, text2path(item)))
+ if(istype(O, item))
if(O.pixel_x == 0 && O.pixel_y == 0)
return 1
return 0
diff --git a/code/_macros_vr.dm b/code/_macros_vr.dm
index daa1123574..ca7bccedbe 100644
--- a/code/_macros_vr.dm
+++ b/code/_macros_vr.dm
@@ -1,2 +1,3 @@
#define isbelly(A) istype(A, /obj/belly)
-#define isstorage(A) istype(A, /obj/item/weapon/storage)
\ No newline at end of file
+#define isstorage(A) istype(A, /obj/item/weapon/storage)
+#define isitem(A) istype(A, /obj/item)
diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm
index 3e998e87d6..f1f2ec0834 100644
--- a/code/game/machinery/frame.dm
+++ b/code/game/machinery/frame.dm
@@ -12,11 +12,6 @@
else
construction_frame_floor += type
- var/datum/frame/frame_types/cancel/cancel = new /datum/frame/frame_types/cancel
- construction_frame_wall += cancel
- construction_frame_floor += cancel
-
-
//////////////////////////////
// Frame Type Datum - Describes the frame structures that can be created from a frame item.
//////////////////////////////
@@ -180,9 +175,6 @@
x_offset = 24
y_offset = 24
-/datum/frame/frame_types/cancel //used to get out of input dialogue
- name = "Cancel"
-
//////////////////////////////
// Frame Object (Structure)
//////////////////////////////
diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm
index 1765eac3ec..0d3c3bcd2c 100644
--- a/code/game/machinery/wall_frames.dm
+++ b/code/game/machinery/wall_frames.dm
@@ -29,8 +29,8 @@
update_type_list()
var/datum/frame/frame_types/frame_type
if(!build_machine_type)
- var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_floor
- if(!response || response.name == "Cancel")
+ var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) as null|anything in frame_types_floor
+ if(!response)
return
frame_type = response
@@ -54,17 +54,6 @@
/obj/item/frame/proc/try_build(turf/on_wall, mob/user as mob)
update_type_list()
- var/datum/frame/frame_types/frame_type
- if(!build_machine_type)
- var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_wall
- if(!response || response.name == "Cancel")
- return
- frame_type = response
-
- build_machine_type = /obj/structure/frame
-
- if(frame_type.frame_size != 5)
- new /obj/item/stack/material/steel(user.loc, (5 - frame_type.frame_size))
if(get_dist(on_wall, user)>1)
return
@@ -92,6 +81,18 @@
to_chat(user, "There's already an item on this wall!")
return
+ var/datum/frame/frame_types/frame_type
+ if(!build_machine_type)
+ var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) as null|anything in frame_types_wall
+ if(!response)
+ return
+ frame_type = response
+
+ build_machine_type = /obj/structure/frame
+
+ if(frame_type.frame_size != 5)
+ new /obj/item/stack/material/steel(user.loc, (5 - frame_type.frame_size))
+
var/obj/machinery/M = new build_machine_type(loc, ndir, 1, frame_type)
M.fingerprints = fingerprints
M.fingerprintshidden = fingerprintshidden
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index 4b69e5db7c..fd2ea3e94b 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -13,31 +13,31 @@
new /obj/item/stack/material/steel( get_turf(src.loc), 2 )
qdel(src)
-/obj/item/frame/apc/try_build(turf/on_wall)
- if (get_dist(on_wall,usr)>1)
+/obj/item/frame/apc/try_build(turf/on_wall, mob/user as mob)
+ if (get_dist(on_wall, user)>1)
return
- var/ndir = get_dir(usr,on_wall)
+ var/ndir = get_dir(user, on_wall)
if (!(ndir in cardinal))
return
- var/turf/loc = get_turf(usr)
+ var/turf/loc = get_turf(user)
var/area/A = loc.loc
if (!istype(loc, /turf/simulated/floor))
- usr << "APC cannot be placed on this spot."
+ to_chat(user, "APC cannot be placed on this spot.")
return
if (A.requires_power == 0 || istype(A, /area/space))
- usr << "APC cannot be placed in this area."
+ to_chat(user, "APC cannot be placed in this area.")
return
if (A.get_apc())
- usr << "This area already has an APC."
+ to_chat(user, "This area already has an APC.")
return //only one APC per area
for(var/obj/machinery/power/terminal/T in loc)
if (T.master)
- usr << "There is another network terminal here."
+ to_chat(user, "There is another network terminal here.")
return
else
var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(loc)
C.amount = 10
- usr << "You cut the cables and disassemble the unused power terminal."
+ to_chat(user, "You cut the cables and disassemble the unused power terminal.")
qdel(T)
new /obj/machinery/power/apc(loc, ndir, 1)
qdel(src)
diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm
index 9615cc8183..d836d23581 100644
--- a/code/game/objects/items/weapons/storage/backpack_vr.dm
+++ b/code/game/objects/items/weapons/storage/backpack_vr.dm
@@ -94,6 +94,13 @@
else
slowdown = initial(slowdown)
return 1
+ if(istype(H) && istype(TT, /datum/sprite_accessory/tail/taur/deer))
+ item_state = "[icon_base]_Deer"
+ if(H.size_multiplier >= RESIZE_BIG) //Are they a macro?
+ slowdown = 0
+ else
+ slowdown = initial(slowdown)
+ return 1
else
H << "[no_message]"
return 0
diff --git a/code/game/objects/structures/crates_lockers/largecrate_vr.dm b/code/game/objects/structures/crates_lockers/largecrate_vr.dm
index c55a3342ab..014b49b522 100644
--- a/code/game/objects/structures/crates_lockers/largecrate_vr.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate_vr.dm
@@ -54,6 +54,7 @@
/mob/living/simple_animal/hostile/bear/brown;0.5,
/mob/living/simple_animal/hostile/carp,
/mob/living/simple_animal/hostile/mimic,
+ /mob/living/simple_animal/hostile/rous,
/mob/living/simple_animal/otie;0.5)
..()
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index cbaf8f8cf8..3186e26e0e 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -311,7 +311,7 @@
qdel(src)
else if(istype(W,/obj/item/frame) && anchored)
var/obj/item/frame/F = W
- F.try_build(src)
+ F.try_build(src, user)
else
user.setClickCooldown(user.get_attack_speed(W))
if(W.damtype == BRUTE || W.damtype == BURN)
diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm
index ffa396e811..549265e954 100644
--- a/code/game/turfs/flooring/flooring.dm
+++ b/code/game/turfs/flooring/flooring.dm
@@ -103,7 +103,7 @@ var/list/flooring_types
/decl/flooring/carpet
name = "carpet"
desc = "Imported and comfy."
- icon = 'icons/turf/flooring/carpet_vr.dmi'
+ icon = 'icons/turf/flooring/carpet.dmi'
icon_base = "carpet"
build_type = /obj/item/stack/tile/carpet
damage_temperature = T0C+200
@@ -337,4 +337,4 @@ var/list/flooring_types
build_type = null
has_damage_range = 6
flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK
- can_paint = null
\ No newline at end of file
+ can_paint = null
diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm
index 73c4053bfa..d80e5f249e 100644
--- a/code/game/turfs/flooring/flooring_premade.dm
+++ b/code/game/turfs/flooring/flooring_premade.dm
@@ -1,6 +1,6 @@
/turf/simulated/floor/carpet
name = "carpet"
- icon = 'icons/turf/flooring/carpet_vr.dmi'
+ icon = 'icons/turf/flooring/carpet.dmi'
icon_state = "carpet"
initial_flooring = /decl/flooring/carpet
@@ -431,4 +431,4 @@
for(var/i in 1 to amt)
add_overlay(image(icon, "footprint[i]", text2num(d)))
-//**** Here ends snow ****
\ No newline at end of file
+//**** Here ends snow ****
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
index 01633b65d3..2bfa5a6aca 100644
--- a/code/game/turfs/simulated/wall_attacks.dm
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -355,7 +355,7 @@
if(istype(W,/obj/item/frame))
var/obj/item/frame/F = W
- F.try_build(src)
+ F.try_build(src, user)
return
else if(!istype(W,/obj/item/weapon/rcd) && !istype(W, /obj/item/weapon/reagent_containers))
diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm
index 8b47cede28..51f29be19a 100644
--- a/code/modules/clothing/spacesuits/void/void_vr.dm
+++ b/code/modules/clothing/spacesuits/void/void_vr.dm
@@ -134,7 +134,7 @@
else
H << "You need to have a horse, wolf, or naga half to wear this."
return 0
-
+
/obj/item/clothing/suit/space/void/medical/alt/taur
name = "taur specific streamlined medical voidsuit"
desc = "A more recent model of Vey-Med voidsuit, featuring the latest in radiation shielding technology. It has a sticker saying one size fits all taurs on it. Below the sticker, it states that it only fits horses, wolves, and naga taurs."
@@ -231,7 +231,7 @@
else
H << "You need to have a horse, wolf, or naga half to wear this."
return 0
-
+
/obj/item/clothing/suit/space/void/security/alt/taur
name = "taur specific riot security voidsuit"
desc = "A heavily armored voidsuit. It has a sticker saying one size fits all taurs on it. Below the sticker, it states that it only fits horses, wolves, and naga taurs."
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
index 8991e2351d..598bea3edb 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
@@ -220,7 +220,6 @@
to_chat(temporary_form,"You need to regenerate more nanites first!")
else if(temporary_form.stat)
to_chat(temporary_form,"You can only do this while not stunned.")
- return
else
nano_outofblob(temporary_form)
@@ -337,12 +336,10 @@
//Blobform using it
else
var/mob/living/simple_animal/protean_blob/blob = usr
- if(!blob.humanform)
- return
do_ability(blob.humanform)
/obj/effect/protean_ability/proc/do_ability(var/mob/living/L)
- if(istype(L) && !L.stat)
+ if(istype(L))
call(L,to_call)()
return FALSE
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
index a37a0d921d..5898afcd96 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
@@ -58,6 +58,8 @@
siemens_coefficient = 3 //Very bad zappy times
rarity_value = 5
+ darksight = 3 // Equivalent to the minor trait
+
has_organ = list(
O_BRAIN = /obj/item/organ/internal/mmi_holder/posibrain/nano,
O_ORCH = /obj/item/organ/internal/nano/orchestrator,
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
index e5287dc96b..adb2338aa1 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
@@ -16,7 +16,7 @@
name = "Apex Metabolism"
desc = "Finally a proper excuse for your predatory actions. Also makes you process reagents faster but that's totally irrelevant. May cause excessive immersions with large/taur characters. Not recommended for efficient law-abiding workers or eco-aware NIF users."
cost = 0
- var_changes = list("metabolic_rate" = 2, "hunger_factor" = 0.5, "metabolism" = 0.010) //Big boy level
+ var_changes = list("metabolic_rate" = 1.5, "hunger_factor" = 0.3, "metabolism" = 0.0075)
excludes = list(/datum/trait/metabolism_up, /datum/trait/metabolism_down)
/datum/trait/cold_discomfort
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index b2c9a0e221..ad3f393116 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -874,8 +874,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
// The following will not work with animated tails.
var/use_species_tail = species.get_tail_hair(src)
if(use_species_tail)
- var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]")
- hair_icon.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
+ var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]_s") //VOREStation edit -- Suffix icon state string with '_s' to compensate for diff in .dmi b/w us & Polaris.
+ hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //VOREStation edit -- Check for species color_mult
tail_icon.Blend(hair_icon, ICON_OVERLAY)
tail_icon_cache[icon_key] = tail_icon
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
index ba50b3e0ec..c18041e1a6 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
@@ -22,6 +22,7 @@
var/synced = FALSE
var/startdrain = 500
var/max_item_count = 1
+ var/gulpsound = 'sound/vore/gulp.ogg'
/obj/item/device/dogborg/sleeper/New()
..()
@@ -55,7 +56,7 @@
if(do_after(user, 30, target) && length(contents) < max_item_count)
target.forceMove(src)
user.visible_message("[hound.name]'s internal analyzer groans lightly as [target.name] slips inside.", "Your internal analyzer groans lightly as [target] slips inside.")
- playsound(hound, 'sound/vore/gulp.ogg', 30, 1)
+ playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises)
if(istype(target,/obj/item))
var/obj/item/tech_item = target
for(var/T in tech_item.origin_tech)
@@ -79,7 +80,7 @@
trashman.reset_view(src)
processing_objects |= src
user.visible_message("[hound.name]'s internal analyzer groans lightly as [trashman] slips inside.", "Your internal analyzer groans lightly as [trashman] slips inside.")
- playsound(hound, 'sound/vore/gulp.ogg', 80, 1)
+ playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises)
update_patient()
if(UI_open == TRUE)
sleeperUI(usr)
@@ -96,7 +97,7 @@
if(do_after(user, 30, target) && length(contents) < max_item_count)
target.forceMove(src)
user.visible_message("[hound.name]'s garbage processor groans lightly as [target.name] slips inside.", "Your garbage compactor groans lightly as [target] slips inside.")
- playsound(hound, 'sound/vore/gulp.ogg', 30, 1)
+ playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises)
update_patient()
if(UI_open == TRUE)
sleeperUI(usr)
@@ -109,7 +110,7 @@
trashmouse.forceMove(src)
trashmouse.reset_view(src)
user.visible_message("[hound.name]'s garbage processor groans lightly as [trashmouse] slips inside.", "Your garbage compactor groans lightly as [trashmouse] slips inside.")
- playsound(hound, 'sound/vore/gulp.ogg', 30, 1)
+ playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises)
update_patient()
if(UI_open == TRUE)
sleeperUI(usr)
@@ -129,7 +130,7 @@
trashman.reset_view(src)
processing_objects |= src
user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.")
- playsound(hound, 'sound/vore/gulp.ogg', 80, 1)
+ playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises)
update_patient()
if(UI_open == TRUE)
sleeperUI(usr)
@@ -157,7 +158,7 @@
processing_objects |= src
user.visible_message("[hound.name]'s medical pod lights up as [H.name] slips inside into their [src.name].", "Your medical pod lights up as [H] slips into your [src]. Life support functions engaged.")
message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])")
- playsound(hound, 'sound/vore/gulp.ogg', 80, 1)
+ playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises)
if(UI_open == TRUE)
sleeperUI(usr)
@@ -462,9 +463,22 @@
//Belly is entirely empty
if(!length(contents))
+ var/finisher = pick(
+ 'sound/vore/death1.ogg',
+ 'sound/vore/death2.ogg',
+ 'sound/vore/death3.ogg',
+ 'sound/vore/death4.ogg',
+ 'sound/vore/death5.ogg',
+ 'sound/vore/death6.ogg',
+ 'sound/vore/death7.ogg',
+ 'sound/vore/death8.ogg',
+ 'sound/vore/death9.ogg',
+ 'sound/vore/death10.ogg')
+ playsound(hound, finisher, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
to_chat(hound, "Your [src.name] is now clean. Ending self-cleaning cycle.")
cleaning = 0
update_patient()
+ playsound(hound, 'sound/machines/ding.ogg', vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
return
if(prob(20))
@@ -481,10 +495,7 @@
'sound/vore/digest10.ogg',
'sound/vore/digest11.ogg',
'sound/vore/digest12.ogg')
- for(var/mob/outhearer in range(1,hound))
- outhearer << sound(churnsound)
- for(var/mob/inhearer in contents)
- inhearer << sound(churnsound)
+ playsound(hound, churnsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
//If the timing is right, and there are items to be touched
if(air_master.current_cycle%3==1 && length(touchable_items))
@@ -523,9 +534,7 @@
'sound/vore/death8.ogg',
'sound/vore/death9.ogg',
'sound/vore/death10.ogg')
- for(var/mob/hearer in range(1,src.hound))
- hearer << deathsound
- T << deathsound
+ playsound(hound, deathsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
if(is_vore_predator(T))
for(var/belly in T.vore_organs)
var/obj/belly/B = belly
diff --git a/code/modules/mob/living/simple_animal/animals/cat_vr.dm b/code/modules/mob/living/simple_animal/animals/cat_vr.dm
index 1c9203126a..9cb954f538 100644
--- a/code/modules/mob/living/simple_animal/animals/cat_vr.dm
+++ b/code/modules/mob/living/simple_animal/animals/cat_vr.dm
@@ -20,14 +20,6 @@
"Runtime flops onto their side for a minute, spilling acids over your form as you remain trapped in them.",
"The CMO's pet doesn't seem to think you're any different from any other meal. At least, their stomach doesn't.")
- B.emote_lists[DM_ITEMWEAK] = list(
- "Runtime's stomach is treating you rather like a mouse, kneading acids into you with vigor.",
- "A thick dollop of bellyslime drips from above while the CMO's pet's gut works on churning you up.",
- "Runtime seems to have decided you're food, based on the acrid air in her guts and the pooling fluids.",
- "Runtime's stomach tries to claim you, kneading and pressing inwards again and again against your form.",
- "Runtime flops onto their side for a minute, spilling acids over your form as you remain trapped in them.",
- "The CMO's pet doesn't seem to think you're any different from any other meal. At least, their stomach doesn't.")
-
B.digest_messages_prey = list(
"Runtime's stomach slowly melts your body away. Her stomach refuses to give up it's onslaught, continuing until you're nothing more than nutrients for her body to absorb.",
"After an agonizing amount of time, Runtime's stomach finally manages to claim you, melting you down and adding you to her stomach.",
diff --git a/code/modules/mob/living/simple_animal/animals/fox_vr.dm b/code/modules/mob/living/simple_animal/animals/fox_vr.dm
index 587a64d14c..84a9a1ca26 100644
--- a/code/modules/mob/living/simple_animal/animals/fox_vr.dm
+++ b/code/modules/mob/living/simple_animal/animals/fox_vr.dm
@@ -61,14 +61,6 @@
"The fox's stomach churns hungrily over your form, trying to take you.",
"With a loud glorp, the stomach spills more acids onto you.")
- B.emote_lists[DM_ITEMWEAK] = list(
- "The guts knead at you, trying to work you into thick soup.",
- "You're ground on by the slimey walls, treated like a mouse.",
- "The acrid air is hard to breathe, and stings at your lungs.",
- "You can feel the acids coating you, ground in by the slick walls.",
- "The fox's stomach churns hungrily over your form, trying to take you.",
- "With a loud glorp, the stomach spills more acids onto you.")
-
// All them complicated fox procedures.
/mob/living/simple_animal/fox/Life()
. = ..()
@@ -209,14 +201,6 @@
"A thick glob of acids drip down from above, adding to the pool of caustic fluids in Renault's belly.",
"There's a loud gurgle as the stomach declares the intent to make you a part of Renault.")
- B.emote_lists[DM_ITEMWEAK] = list(
- "Renault's stomach walls grind hungrily inwards, kneading acids against your form, and treating you like any other food.",
- "The captain's fox impatiently kneads and works acids against you, trying to claim your body for fuel.",
- "The walls knead in firmly, squeezing and tossing you around briefly in disorienting aggression.",
- "Renault belches, letting the remaining air grow more acrid. It burns your lungs with each breath.",
- "A thick glob of acids drip down from above, adding to the pool of caustic fluids in Renault's belly.",
- "There's a loud gurgle as the stomach declares the intent to make you a part of Renault.")
-
/mob/living/simple_animal/fox/syndicate
name = "syndi-fox"
desc = "It's a DASTARDLY fox! The horror! Call the shuttle!"
diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
index faae913d44..883c43e30f 100644
--- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
@@ -15,7 +15,8 @@
var/vore_standing_too = 0 // Can also eat non-stunned mobs
var/vore_ignores_undigestable = 1 // Refuse to eat mobs who are undigestable by the prefs toggle.
- var/vore_default_mode = DM_ITEMWEAK // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB)
+ var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB)
+ var/vore_default_flags = DM_FLAG_ITEMWEAK // Itemweak by default
var/vore_digest_chance = 25 // Chance to switch to digest mode if resisted
var/vore_absorb_chance = 0 // Chance to switch to absorb mode if resisted
var/vore_escape_chance = 25 // Chance of resisting out of mob
@@ -147,6 +148,7 @@
B.name = vore_stomach_name ? vore_stomach_name : "stomach"
B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
B.digest_mode = vore_default_mode
+ B.mode_flags = vore_default_flags
B.escapable = vore_escape_chance > 0
B.escapechance = vore_escape_chance
B.digestchance = vore_digest_chance
@@ -174,16 +176,6 @@
"The juices pooling beneath you sizzle against your sore skin.",
"The churning walls slowly pulverize you into meaty nutrients.",
"The stomach glorps and gurgles as it tries to work you into slop.")
- B.emote_lists[DM_ITEMWEAK] = list(
- "The burning acids eat away at your form.",
- "The muscular stomach flesh grinds harshly against you.",
- "The caustic air stings your chest when you try to breathe.",
- "The slimy guts squeeze inward to help the digestive juices soften you up.",
- "The onslaught against your body doesn't seem to be letting up; you're food now.",
- "The predator's body ripples and crushes against you as digestive enzymes pull you apart.",
- "The juices pooling beneath you sizzle against your sore skin.",
- "The churning walls slowly pulverize you into meaty nutrients.",
- "The stomach glorps and gurgles as it tries to work you into slop.")
/mob/living/simple_animal/Bumped(var/atom/movable/AM, yes)
if(ismob(AM))
diff --git a/code/modules/mob/living/simple_animal/vore/rous.dm b/code/modules/mob/living/simple_animal/vore/rous.dm
new file mode 100644
index 0000000000..9b47810f36
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/vore/rous.dm
@@ -0,0 +1,46 @@
+/mob/living/simple_animal/hostile/rous
+ name = "giant rat"
+ desc = "In what passes for a hierarchy among verminous rodents, this one is king."
+ tt_desc = "Mus muscular"
+ icon = 'icons/mob/vore64x32.dmi'
+ icon_state = "rous"
+ icon_living = "rous"
+ icon_dead = "rous-dead"
+ icon_rest = "rous_rest"
+ faction = "mouse"
+
+ maxHealth = 150
+ health = 150
+
+ investigates = TRUE
+ melee_damage_lower = 5
+ melee_damage_upper = 15
+ grab_resist = 100
+
+ speak_chance = 4
+ speak = list("Squeek!","SQUEEK!","Squeek?")
+ speak_emote = list("squeeks","squeeks","squiks")
+ emote_hear = list("squeeks","squeaks","squiks")
+ emote_see = list("runs in a circle", "shakes", "scritches at something")
+ say_maybe_target = list("Squeek?")
+ say_got_target = list("SQUEEK!")
+ response_help = "pets the"
+ response_disarm = "bops the"
+ response_harm = "hits the"
+ attacktext = list("ravaged")
+ friendly = list("nuzzles", "licks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on")
+
+ old_x = -16
+ old_y = 0
+ default_pixel_x = -16
+ pixel_x = -16
+ pixel_y = 0
+
+ vore_active = TRUE
+ vore_capacity = 1
+ vore_pounce_chance = 45
+ vore_icons = SA_ICON_LIVING | SA_ICON_REST
+
+/mob/living/simple_animal/hostile/rous/death()
+ playsound(src, 'sound/effects/mouse_squeak_loud.ogg', 50, 1)
+ ..()
diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm
index 24053b4bca..2dfecc479c 100644
--- a/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm
+++ b/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm
@@ -154,12 +154,6 @@
"The grip of that stomach is harsh. Eagerly mushing and rubbing that slime into your body in attempts to break you down!",
"The intense churning and grinding jostles your around within the thick slime as you're slowly broken down!"
)
- B.emote_lists[DM_ITEMWEAK] = list(
- "The walls slop thick slime across your body! It tingles briefly before the sting and ache sets in!",
- "The sound of your body slipping and sliding against the powerfully churning stomach fills the air!",
- "The grip of that stomach is harsh. Eagerly mushing and rubbing that slime into your body in attempts to break you down!",
- "The intense churning and grinding jostles your around within the thick slime as you're slowly broken down!"
- )
B.emote_lists[DM_ABSORB] = list(
"The walls cling to you awfully close... It's almost like you're sinking into them.",
"You can feel the walls press in tightly against you, clinging to you posessively!",
diff --git a/code/modules/mob/living/simple_animal/vore/solargrub.dm b/code/modules/mob/living/simple_animal/vore/solargrub.dm
index 0dfb81cd09..6e34a1c2d1 100644
--- a/code/modules/mob/living/simple_animal/vore/solargrub.dm
+++ b/code/modules/mob/living/simple_animal/vore/solargrub.dm
@@ -96,7 +96,7 @@ List of things solar grubs should be able to do:
vore_active = 1
vore_capacity = 1
vore_pounce_chance = 0 //grubs only eat incapacitated targets
- vore_default_mode = DM_ITEMWEAK //item friendly digestions, they just want your chemical energy :3
+ vore_default_mode = DM_DIGEST
/mob/living/simple_animal/retaliate/solargrub/PunchTarget()
. = ..()
diff --git a/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm
index a8ce697d64..3b4074e455 100644
--- a/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm
+++ b/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm
@@ -243,4 +243,6 @@
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.digest_mode = safe ? DM_HOLD : vore_default_mode
-
\ No newline at end of file
+
+/mob/living/simple_animal/mouse
+ faction = "mouse" //Giving mice a faction so certain mobs can get along with them.
\ No newline at end of file
diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm
index 1c8b9c8f12..8e067a46e8 100644
--- a/code/modules/vore/appearance/sprite_accessories_vr.dm
+++ b/code/modules/vore/appearance/sprite_accessories_vr.dm
@@ -1235,6 +1235,26 @@
msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!"
msg_prey_grab_fail = "%owner steps down and squishes you with their hoof, forcing you down to the ground!"
+/datum/sprite_accessory/tail/taur/deer
+ name = "Deer dual-color (Taur)"
+ icon_state = "deer_s"
+ extra_overlay = "deer_markings"
+
+ msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!"
+ msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!"
+
+ msg_owner_disarm_walk = "You firmly push your hoof down on %prey, painfully but harmlessly pinning them to the ground!"
+ msg_prey_disarm_walk = "%owner firmly pushes their hoof down on you, quite painfully but harmlessly pinning you to the ground!"
+
+ msg_owner_harm_walk = "You methodically place your hoof down upon %prey's body, slowly applying pressure, crushing them against the floor below!"
+ msg_prey_harm_walk = "%owner methodically places their hoof upon your body, slowly applying pressure, crushing you against the floor below!"
+
+ msg_owner_grab_success = "You pin %prey to the ground before scooping them up with your hooves!"
+ msg_prey_grab_success = "%owner pins you to the ground before scooping you up with their hooves!"
+
+ msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!"
+ msg_prey_grab_fail = "%owner steps down and squishes you with their hoof, forcing you down to the ground!"
+
/datum/sprite_accessory/tail/taur/lizard
name = "Lizard (Taur)"
icon_state = "lizard_s"
diff --git a/code/modules/vore/eating/belly_dat_vr.dm b/code/modules/vore/eating/belly_dat_vr.dm
index 9453edc66f..accd3c9bf2 100644
--- a/code/modules/vore/eating/belly_dat_vr.dm
+++ b/code/modules/vore/eating/belly_dat_vr.dm
@@ -30,7 +30,7 @@
var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off.
var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest.
- var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ITEMWEAK,DM_STRIPDIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_DIGEST_NUMB) // Possible digest modes
+ var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL) // Possible digest modes
var/tmp/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)
var/tmp/mob/living/owner // The mob whose belly this is.
var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly!
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 8affcb171d..0d4c9705f9 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -32,14 +32,22 @@
var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to.
var/transferlocation // Location that the prey is released if they struggle and get dropped off.
var/release_sound = TRUE // Boolean for now, maybe replace with something else later
+ var/mode_flags = 0 // Stripping, numbing, etc.
//I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere.
- var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ITEMWEAK,DM_STRIPDIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_DIGEST_NUMB) // Possible digest modes
+ //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)
+ //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)
+
+ //List of slots that stripping handles strips
var/tmp/static/list/slots = list(slot_back,slot_handcuffed,slot_l_store,slot_r_store,slot_wear_mask,slot_l_hand,slot_r_hand,slot_wear_id,slot_glasses,slot_gloves,slot_head,slot_shoes,slot_belt,slot_wear_suit,slot_w_uniform,slot_s_store,slot_l_ear,slot_r_ear)
var/tmp/mob/living/owner // The mob whose belly this is.
var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human)
+ var/tmp/tf_mode = DM_TRANSFORM_REPLICA // Current transformation mode.
var/tmp/next_process = 0 // Waiting for this SSbellies times_fired to process again.
var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again.
var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a belly controller tick #
@@ -127,7 +135,8 @@
"digest_messages_owner",
"digest_messages_prey",
"examine_messages",
- "emote_lists"
+ "emote_lists",
+ "mode_flags"
)
/obj/belly/New(var/newloc)
@@ -359,9 +368,12 @@
brain.forceMove(src)
items_preserved += brain
for(var/slot in slots)
- var/obj/item/thingy = M.get_equipped_item(slot = slot)
- if(thingy)
- M.unEquip(thingy,force = TRUE)
+ var/obj/item/I = M.get_equipped_item(slot = slot)
+ if(I)
+ M.unEquip(I,force = TRUE)
+ I.gurgle_contaminate(contents, owner) //We do an initial contamination pass to get stuff like IDs wet.
+ if(mode_flags & DM_FLAG_ITEMWEAK)
+ items_preserved |= I
//Reagent transfer
if(ishuman(owner))
@@ -383,6 +395,8 @@
M.absorbed = 1
to_chat(M,"[owner]'s [lowertext(name)] absorbs your body, making you part of them.")
to_chat(owner,"Your [lowertext(name)] absorbs [M]'s body, making them part of you.")
+ if(M.noisy) //Mute drained absorbee hunger if enabled.
+ M.noisy = FALSE
if(ishuman(M) && ishuman(owner))
var/mob/living/carbon/human/Prey = M
@@ -533,17 +547,12 @@
digest_mode = DM_ABSORB
return
- else if(prob(digestchance) && digest_mode != DM_ITEMWEAK && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
+ else if(prob(digestchance) && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get more active...")
to_chat(owner,"You feel your [lowertext(name)] beginning to become active!")
- digest_mode = DM_ITEMWEAK
- return
-
- else if(prob(digestchance) && digest_mode == DM_ITEMWEAK) //Oh god it gets even worse if you fail twice!
- to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get even more active!")
- to_chat(owner,"You feel your [lowertext(name)] beginning to become even more active!")
digest_mode = DM_DIGEST
return
+
else //Nothing interesting happened.
to_chat(R,"You make no progress in escaping [owner]'s [lowertext(name)].")
to_chat(owner,"Your prey appears to be unable to make any progress in escaping your [lowertext(name)].")
@@ -601,6 +610,7 @@
dupe.transferlocation = transferlocation
dupe.bulge_size = bulge_size
dupe.shrink_grow_size = shrink_grow_size
+ dupe.mode_flags = mode_flags
//// Object-holding variables
//struggle_messages_outside - strings
diff --git a/code/modules/vore/eating/bellymodes_tf_vr.dm b/code/modules/vore/eating/bellymodes_tf_vr.dm
new file mode 100644
index 0000000000..1f638f4f98
--- /dev/null
+++ b/code/modules/vore/eating/bellymodes_tf_vr.dm
@@ -0,0 +1,237 @@
+/obj/belly/proc/process_tf(var/mode,var/list/touchable_mobs) //We pass mode so it's mega-ultra local.
+ /* May not be necessary... Transform only shows up in the panel for humans.
+ if(!ishuman(owner))
+ return //Need DNA and junk for this.
+ */
+
+ //Cast here for reduced duplication
+ var/mob/living/carbon/human/O = owner
+
+///////////////////////////// DM_TRANSFORM_HAIR_AND_EYES /////////////////////////////
+ if(mode == DM_TRANSFORM_HAIR_AND_EYES)
+ for (var/mob/living/carbon/human/P in touchable_mobs)
+ if(P.stat == DEAD)
+ continue
+
+ if(O.nutrition > 400 && P.nutrition < 400)
+ O.nutrition -= 2
+ P.nutrition += 1.5
+
+ if(check_eyes(P) || check_hair(P))
+ change_eyes(P)
+ change_hair(P,1)
+
+///////////////////////////// DM_TRANSFORM_MALE /////////////////////////////
+ else if(mode == DM_TRANSFORM_MALE)
+ for (var/mob/living/carbon/human/P in touchable_mobs)
+ if(P.stat == DEAD)
+ continue
+
+ if(O.nutrition > 400 && P.nutrition < 400)
+ O.nutrition -= 2
+ P.nutrition += 1.5
+
+ if(check_eyes(P))
+ change_eyes(P,1)
+ continue
+
+ if(check_hair(P) || check_skin(P))
+ change_hair(P)
+ change_skin(P,1)
+ continue
+
+ if(check_gender(P,MALE))
+ change_gender(P,MALE,1)
+
+///////////////////////////// DM_TRANSFORM_FEMALE /////////////////////////////
+ else if(mode == DM_TRANSFORM_FEMALE)
+ for (var/mob/living/carbon/human/P in touchable_mobs)
+ if(P.stat == DEAD)
+ continue
+
+ if(O.nutrition > 400 && P.nutrition < 400)
+ O.nutrition -= 2
+ P.nutrition += 1.5
+
+ if(check_eyes(P))
+ change_eyes(P,1)
+ continue
+
+ if(check_hair(P) || check_skin(P))
+ change_hair(P)
+ change_skin(P,1)
+ continue
+
+ if(check_gender(P,FEMALE))
+ change_gender(P,FEMALE,1)
+
+///////////////////////////// DM_TRANSFORM_KEEP_GENDER /////////////////////////////
+ else if(mode == DM_TRANSFORM_KEEP_GENDER)
+ for (var/mob/living/carbon/human/P in touchable_mobs)
+ if(P.stat == DEAD)
+ continue
+
+ if(O.nutrition > 400 && P.nutrition < 400)
+ O.nutrition -= 2
+ P.nutrition += 1.5
+
+ if(check_eyes(P))
+ change_eyes(P,1)
+ continue
+
+ if(check_hair(P) || check_skin(P))
+ change_hair(P)
+ change_skin(P,1)
+
+///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR /////////////////////////////
+ else if(mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR)
+ for (var/mob/living/carbon/human/P in touchable_mobs)
+ if(P.stat == DEAD)
+ continue
+
+ if(O.nutrition > 400 && P.nutrition < 400)
+ O.nutrition -= 2
+ P.nutrition += 1.5
+
+ if(check_ears(P) || check_tail_nocolor(P) || check_wing_nocolor(P) || check_species(P))
+ change_ears(P)
+ change_tail_nocolor(P)
+ change_wing_nocolor(P)
+ change_species(P,1)
+
+///////////////////////////// DM_TRANSFORM_REPLICA /////////////////////////////
+ else if(mode == DM_TRANSFORM_REPLICA)
+ for (var/mob/living/carbon/human/P in touchable_mobs)
+ if(P.stat == DEAD)
+ continue
+
+ if(O.nutrition > 400 && P.nutrition < 400)
+ O.nutrition -= 2
+ P.nutrition += 1.5
+
+ if(check_eyes(P))
+ change_eyes(P,1)
+ continue
+
+ if(check_hair(P) || check_skin(P))
+ change_hair(P)
+ change_skin(P,1)
+ continue
+
+ if(check_ears(P) || check_tail(P) || check_wing(P) || check_species(P))
+ change_ears(P)
+ change_tail(P)
+ change_wing(P)
+ change_species(P,1)
+
+///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG /////////////////////////////
+ else if(mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG)
+ for (var/mob/living/carbon/human/P in touchable_mobs)
+ if(P.stat == DEAD)
+ continue
+
+ if(check_ears(P) || check_tail_nocolor(P) || check_wing_nocolor(P)|| check_species(P))
+ change_ears(P)
+ change_tail_nocolor(P)
+ change_wing_nocolor(P)
+ change_species(P,1)
+ continue
+
+ if(!P.absorbed)
+ put_in_egg(P,1)
+
+///////////////////////////// DM_TRANSFORM_KEEP_GENDER_EGG /////////////////////////////
+ else if(mode == DM_TRANSFORM_KEEP_GENDER_EGG)
+ for (var/mob/living/carbon/human/P in touchable_mobs)
+ if(P.stat == DEAD)
+ continue
+
+ if(check_eyes(P))
+ change_eyes(P,1)
+ continue
+
+ if(check_hair(P) || check_skin(P))
+ change_hair(P)
+ change_skin(P,1)
+ continue
+
+ if(!P.absorbed)
+ put_in_egg(P,1)
+
+///////////////////////////// DM_TRANSFORM_REPLICA_EGG /////////////////////////////
+ else if(mode == DM_TRANSFORM_REPLICA_EGG)
+ for (var/mob/living/carbon/human/P in touchable_mobs)
+ if(P.stat == DEAD)
+ continue
+
+ if(check_eyes(P))
+ change_eyes(P,1)
+ continue
+
+ if(check_hair(P) || check_skin(P))
+ change_hair(P)
+ change_skin(P,1)
+ continue
+
+ if(check_ears(P) || check_tail(P) || check_wing(P) || check_species(P))
+ change_ears(P)
+ change_tail(P)
+ change_wing(P)
+ change_species(P,1)
+ continue
+
+ if(!P.absorbed)
+ put_in_egg(P,1)
+
+///////////////////////////// DM_TRANSFORM_MALE_EGG /////////////////////////////
+ else if(mode == DM_TRANSFORM_MALE_EGG)
+ for (var/mob/living/carbon/human/P in touchable_mobs)
+ if(P.stat == DEAD)
+ continue
+
+ if(check_eyes(P))
+ change_eyes(P,1)
+ continue
+
+ if(check_hair(P) || check_skin(P))
+ change_hair(P)
+ change_skin(P,1)
+ continue
+
+ if(check_gender(P,MALE))
+ change_gender(P,MALE,1)
+ continue
+
+ if(!P.absorbed)
+ put_in_egg(P,1)
+
+///////////////////////////// DM_TRANSFORM_FEMALE_EGG /////////////////////////////
+ else if(mode == DM_TRANSFORM_FEMALE_EGG)
+ for (var/mob/living/carbon/human/P in touchable_mobs)
+ if(P.stat == DEAD)
+ continue
+
+ if(check_eyes(P))
+ change_eyes(P,1)
+ continue
+
+ if(check_hair(P) || check_skin(P))
+ change_hair(P)
+ change_skin(P,1)
+ continue
+
+ if(check_gender(P,MALE))
+ change_gender(P,MALE,1)
+ continue
+
+ if(!P.absorbed)
+ put_in_egg(P,1)
+
+///////////////////////////// DM_EGG /////////////////////////////
+ else if(mode == DM_EGG)
+ for (var/mob/living/carbon/human/P in touchable_mobs)
+ if(P.absorbed || P.stat == DEAD)
+ continue
+
+ put_in_egg(P,1)
+
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index b91ba43b64..fc0439ecca 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -20,30 +20,74 @@
var/list/EL = emote_lists[digest_mode]
if(LAZYLEN(EL))
for(var/mob/living/M in contents)
- if(M.digestable || !(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK)) // don't give digesty messages to indigestible people
+ if(M.digestable || digest_mode != DM_DIGEST) // don't give digesty messages to indigestible people
to_chat(M,"[pick(EL)]")
/////////////////////////// Exit Early ////////////////////////////
- var/list/touchable_items = contents - items_preserved
- if(!length(touchable_items))
+ var/list/touchable_atoms = contents - items_preserved
+ if(!length(touchable_atoms))
return SSBELLIES_PROCESSED
-//////////////////////// Absorbed Handling ////////////////////////
- for(var/mob/living/M in contents)
- if(M.absorbed)
- M.Weaken(5)
+ var/list/touchable_mobs = list()
+
+///////////////////// Early Non-Mode Handling /////////////////////
+ var/did_an_item = FALSE
+ for(var/A in touchable_atoms)
+ //Handle stray items
+ if(isitem(A) && !did_an_item)
+ var/obj/item/I = A
+ if(mode_flags & DM_FLAG_ITEMWEAK)
+ I.gurgle_contaminate(contents, owner)
+ items_preserved |= I
+ else
+ digest_item(I)
+ owner.updateVRPanel()
+ did_an_item = TRUE
+
+ //Handle eaten mobs
+ else if(isliving(A))
+ var/mob/living/L = A
+ touchable_mobs += L
+
+ if(L.absorbed)
+ L.Weaken(5)
+
+ //Handle 'human'
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+
+ //Numbing flag
+ if(mode_flags & DM_FLAG_NUMBING)
+ if(H.bloodstr.get_reagent_amount("numbenzyme") < 2)
+ H.bloodstr.add_reagent("numbenzyme",4)
+
+ //Stripping flag
+ if(mode_flags & DM_FLAG_STRIPPING)
+ for(var/slot in slots)
+ var/obj/item/I = H.get_equipped_item(slot = slot)
+ if(I)
+ H.unEquip(I,force = TRUE)
+ if(mode_flags & DM_FLAG_ITEMWEAK)
+ I.gurgle_contaminate(contents, owner)
+ items_preserved |= I
+ else
+ digest_item(I)
+ owner.updateVRPanel()
+ H.updateVRPanel()
+ break
///////////////////////////// DM_HOLD /////////////////////////////
if(digest_mode == DM_HOLD)
return SSBELLIES_PROCESSED //Pretty boring, huh
//////////////////////////// DM_DIGEST ////////////////////////////
- else if(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK)
+ else if(digest_mode == DM_DIGEST)
if(prob(50)) //Was SO OFTEN. AAAA.
play_sound = pick(digestion_sounds)
- for (var/mob/living/M in contents)
+ for (var/target in touchable_mobs)
+ var/mob/living/M = target
//Pref protection!
if (!M.digestable || M.absorbed)
continue
@@ -78,11 +122,6 @@
owner.nutrition += 4.5*compensation
continue
- if(digest_mode == DM_DIGEST_NUMB && ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.bloodstr.get_reagent_amount("numbenzyme") < 5)
- H.bloodstr.add_reagent("numbenzyme",10)
-
// Deal digestion damage (and feed the pred)
M.adjustBruteLoss(digest_brute)
M.adjustFireLoss(digest_burn)
@@ -98,49 +137,13 @@
owner.nutrition += 4.5*(digest_brute+digest_burn)/difference
M.updateVRPanel()
- //Contaminate or gurgle items
- var/obj/item/T = pick(touchable_items)
- if(istype(T))
- if(digest_mode == DM_ITEMWEAK)
- if(istype(T,/obj/item/weapon/reagent_containers/food) || istype(T,/obj/item/weapon/holder) || istype(T,/obj/item/organ))
- digest_item(T)
- else
- T.gurgle_contaminate(contents, owner)
- items_preserved |= T
- else
- digest_item(T)
-
- owner.updateVRPanel()
-
-//////////////////////////// DM_STRIPDIGEST ////////////////////////////
- else if(digest_mode == DM_STRIPDIGEST) // Only gurgle the gear off your prey.
-
- if(prob(50))
- play_sound = pick(digestion_sounds)
-
- // Handle loose items first.
- var/obj/item/T = pick(touchable_items)
- if(istype(T))
- digest_item(T)
-
- for(var/mob/living/carbon/human/M in contents)
- if (M.absorbed)
- continue
- for(var/slot in slots)
- var/obj/item/thingy = M.get_equipped_item(slot = slot)
- if(thingy)
- M.unEquip(thingy,force = TRUE)
- digest_item(thingy)
- break
- M.updateVRPanel()
-
owner.updateVRPanel()
//////////////////////////// DM_ABSORB ////////////////////////////
else if(digest_mode == DM_ABSORB)
- for (var/mob/living/M in contents)
-
+ for (var/target in touchable_mobs)
+ var/mob/living/M = target
if(prob(10)) //Less often than gurgles. People might leave this on forever.
play_sound = pick(digestion_sounds)
@@ -157,7 +160,9 @@
//////////////////////////// DM_UNABSORB ////////////////////////////
else if(digest_mode == DM_UNABSORB)
- for (var/mob/living/M in contents)
+ for (var/target in touchable_mobs)
+ var/mob/living/M = target
+
if(M.absorbed && owner.nutrition >= 100)
M.absorbed = 0
to_chat(M,"You suddenly feel solid again ")
@@ -167,8 +172,9 @@
//////////////////////////// DM_DRAIN ////////////////////////////
else if(digest_mode == DM_DRAIN)
- for (var/mob/living/M in contents)
-
+ for (var/target in touchable_mobs)
+ var/mob/living/M = target
+
if(prob(10)) //Less often than gurgles. People might leave this on forever.
play_sound = pick(digestion_sounds)
@@ -180,13 +186,15 @@
//////////////////////////// DM_SHRINK ////////////////////////////
else if(digest_mode == DM_SHRINK)
- for (var/mob/living/M in contents)
-
+ for (var/target in touchable_mobs)
+ var/mob/living/M = target
+
if(prob(10)) //Infinite gurgles!
play_sound = pick(digestion_sounds)
if(M.size_multiplier > shrink_grow_size) //Shrink until smol.
M.resize(M.size_multiplier-0.01) //Shrink by 1% per tick.
+
if(M.nutrition >= 100) //Absorbing bodymass results in nutrition if possible.
var/oldnutrition = (M.nutrition * 0.05)
M.nutrition = (M.nutrition * 0.95)
@@ -195,8 +203,9 @@
//////////////////////////// DM_GROW ////////////////////////////
else if(digest_mode == DM_GROW)
- for (var/mob/living/M in contents)
-
+ for (var/target in touchable_mobs)
+ var/mob/living/M = target
+
if(prob(10))
play_sound = pick(digestion_sounds)
@@ -208,14 +217,16 @@
//////////////////////////// DM_SIZE_STEAL ////////////////////////////
else if(digest_mode == DM_SIZE_STEAL)
- for (var/mob/living/M in contents)
-
+ for (var/target in touchable_mobs)
+ var/mob/living/M = target
+
if(prob(10))
play_sound = pick(digestion_sounds)
if(M.size_multiplier > shrink_grow_size && owner.size_multiplier < 2) //Grow until either pred is large or prey is small.
owner.resize(owner.size_multiplier+0.01) //Grow by 1% per tick.
M.resize(M.size_multiplier-0.01) //Shrink by 1% per tick
+
if(M.nutrition >= 100)
var/oldnutrition = (M.nutrition * 0.05)
M.nutrition = (M.nutrition * 0.95)
@@ -223,261 +234,31 @@
///////////////////////////// DM_HEAL /////////////////////////////
else if(digest_mode == DM_HEAL)
- if(prob(50)) //Wet heals!
+
+ if(prob(50)) //Wet heals! The secret is you can leave this on for gurgle noises for fun.
play_sound = pick(digestion_sounds)
- for (var/mob/living/M in contents)
- if(M.stat != DEAD)
- if(owner.nutrition > 90 && (M.health < M.maxHealth))
- M.adjustBruteLoss(-5)
- M.adjustFireLoss(-5)
- owner.nutrition -= 2
- if(M.nutrition <= 400)
- M.nutrition += 1
- else if(owner.nutrition > 90 && (M.nutrition <= 400))
- owner.nutrition -= 1
+ for (var/target in touchable_mobs)
+ var/mob/living/M = target
+
+ if(M.stat == DEAD)
+ continue
+
+ if(owner.nutrition > 90 && (M.health < M.maxHealth))
+ M.adjustBruteLoss(-5)
+ M.adjustFireLoss(-5)
+ owner.nutrition -= 2
+ if(M.nutrition <= 400)
M.nutrition += 1
+ else if(owner.nutrition > 90 && (M.nutrition <= 400))
+ owner.nutrition -= 1
+ M.nutrition += 1
-///////////////////////////// DM_TRANSFORM_HAIR_AND_EYES /////////////////////////////
- else if(digest_mode == DM_TRANSFORM_HAIR_AND_EYES && ishuman(owner))
- for (var/mob/living/carbon/human/P in contents)
- if(P.stat == DEAD)
- continue
-
- var/mob/living/carbon/human/O = owner
-
- if(O.nutrition > 400 && P.nutrition < 400)
- O.nutrition -= 2
- P.nutrition += 1.5
-
- if(check_eyes(P) || check_hair(P))
- change_eyes(P)
- change_hair(P,1)
-
-///////////////////////////// DM_TRANSFORM_MALE /////////////////////////////
- else if(digest_mode == DM_TRANSFORM_MALE && ishuman(owner))
- for (var/mob/living/carbon/human/P in contents)
- if(P.stat == DEAD)
- continue
-
- var/mob/living/carbon/human/O = owner
-
- if(O.nutrition > 400 && P.nutrition < 400)
- O.nutrition -= 2
- P.nutrition += 1.5
-
- if(check_eyes(P))
- change_eyes(P,1)
- continue
-
- if(check_hair(P) || check_skin(P))
- change_hair(P)
- change_skin(P,1)
- continue
-
- if(check_gender(P,MALE))
- change_gender(P,MALE,1)
-
-///////////////////////////// DM_TRANSFORM_FEMALE /////////////////////////////
- else if(digest_mode == DM_TRANSFORM_FEMALE && ishuman(owner))
- for (var/mob/living/carbon/human/P in contents)
- if(P.stat == DEAD)
- continue
-
- var/mob/living/carbon/human/O = owner
-
- if(O.nutrition > 400 && P.nutrition < 400)
- O.nutrition -= 2
- P.nutrition += 1.5
-
- if(check_eyes(P))
- change_eyes(P,1)
- continue
-
- if(check_hair(P) || check_skin(P))
- change_hair(P)
- change_skin(P,1)
- continue
-
- if(check_gender(P,FEMALE))
- change_gender(P,FEMALE,1)
-
-///////////////////////////// DM_TRANSFORM_KEEP_GENDER /////////////////////////////
- else if(digest_mode == DM_TRANSFORM_KEEP_GENDER && ishuman(owner))
- for (var/mob/living/carbon/human/P in contents)
- if(P.stat == DEAD)
- continue
-
- var/mob/living/carbon/human/O = owner
-
- if(O.nutrition > 400 && P.nutrition < 400)
- O.nutrition -= 2
- P.nutrition += 1.5
-
- if(check_eyes(P))
- change_eyes(P,1)
- continue
-
- if(check_hair(P) || check_skin(P))
- change_hair(P)
- change_skin(P,1)
-
-///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR /////////////////////////////
- else if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR && ishuman(owner))
- for (var/mob/living/carbon/human/P in contents)
- if(P.stat == DEAD)
- continue
-
- var/mob/living/carbon/human/O = owner
-
- if(O.nutrition > 400 && P.nutrition < 400)
- O.nutrition -= 2
- P.nutrition += 1.5
-
- if(check_ears(P) || check_tail_nocolor(P) || check_wing_nocolor(P) || check_species(P))
- change_ears(P)
- change_tail_nocolor(P)
- change_wing_nocolor(P)
- change_species(P,1)
-
-///////////////////////////// DM_TRANSFORM_REPLICA /////////////////////////////
- else if(digest_mode == DM_TRANSFORM_REPLICA && ishuman(owner))
- for (var/mob/living/carbon/human/P in contents)
- if(P.stat == DEAD)
- continue
-
- var/mob/living/carbon/human/O = owner
-
- if(O.nutrition > 400 && P.nutrition < 400)
- O.nutrition -= 2
- P.nutrition += 1.5
-
- if(check_eyes(P))
- change_eyes(P,1)
- continue
-
- if(check_hair(P) || check_skin(P))
- change_hair(P)
- change_skin(P,1)
- continue
-
- if(check_ears(P) || check_tail(P) || check_wing(P) || check_species(P))
- change_ears(P)
- change_tail(P)
- change_wing(P)
- change_species(P,1)
-
-///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG /////////////////////////////
- else if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG && ishuman(owner))
- for (var/mob/living/carbon/human/P in contents)
- if(P.stat == DEAD)
- continue
-
- if(check_ears(P) || check_tail_nocolor(P) || check_wing_nocolor(P)|| check_species(P))
- change_ears(P)
- change_tail_nocolor(P)
- change_wing_nocolor(P)
- change_species(P,1)
- continue
-
- if(!P.absorbed)
- put_in_egg(P,1)
-
-///////////////////////////// DM_TRANSFORM_KEEP_GENDER_EGG /////////////////////////////
- else if(digest_mode == DM_TRANSFORM_KEEP_GENDER_EGG && ishuman(owner))
- for (var/mob/living/carbon/human/P in contents)
- if(P.stat == DEAD)
- continue
-
- if(check_eyes(P))
- change_eyes(P,1)
- continue
-
- if(check_hair(P) || check_skin(P))
- change_hair(P)
- change_skin(P,1)
- continue
-
- if(!P.absorbed)
- put_in_egg(P,1)
-
-///////////////////////////// DM_TRANSFORM_REPLICA_EGG /////////////////////////////
- else if(digest_mode == DM_TRANSFORM_REPLICA_EGG && ishuman(owner))
- for (var/mob/living/carbon/human/P in contents)
- if(P.stat == DEAD)
- continue
-
- if(check_eyes(P))
- change_eyes(P,1)
- continue
-
- if(check_hair(P) || check_skin(P))
- change_hair(P)
- change_skin(P,1)
- continue
-
- if(check_ears(P) || check_tail(P) || check_wing(P) || check_species(P))
- change_ears(P)
- change_tail(P)
- change_wing(P)
- change_species(P,1)
- continue
-
- if(!P.absorbed)
- put_in_egg(P,1)
-
-///////////////////////////// DM_TRANSFORM_MALE_EGG /////////////////////////////
- else if(digest_mode == DM_TRANSFORM_MALE_EGG && ishuman(owner))
- for (var/mob/living/carbon/human/P in contents)
- if(P.stat == DEAD)
- continue
-
- if(check_eyes(P))
- change_eyes(P,1)
- continue
-
- if(check_hair(P) || check_skin(P))
- change_hair(P)
- change_skin(P,1)
- continue
-
- if(check_gender(P,MALE))
- change_gender(P,MALE,1)
- continue
-
- if(!P.absorbed)
- put_in_egg(P,1)
-
-///////////////////////////// DM_TRANSFORM_FEMALE_EGG /////////////////////////////
- else if(digest_mode == DM_TRANSFORM_FEMALE_EGG && ishuman(owner))
- for (var/mob/living/carbon/human/P in contents)
- if(P.stat == DEAD)
- continue
-
- if(check_eyes(P))
- change_eyes(P,1)
- continue
-
- if(check_hair(P) || check_skin(P))
- change_hair(P)
- change_skin(P,1)
- continue
-
- if(check_gender(P,MALE))
- change_gender(P,MALE,1)
- continue
-
- if(!P.absorbed)
- put_in_egg(P,1)
-
-///////////////////////////// DM_EGG /////////////////////////////
- else if(digest_mode == DM_EGG && ishuman(owner))
- for (var/mob/living/carbon/human/P in contents)
- if(P.absorbed || P.stat == DEAD)
- continue
-
- put_in_egg(P,1)
+/////////////////////////// DM_TRANSFORM ///////////////////////////
+ else if(digest_mode == DM_TRANSFORM)
+ process_tf(tf_mode, touchable_mobs)
+/////////////////////////// Make any noise ///////////////////////////
if(play_sound)
playsound(src, play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
return SSBELLIES_PROCESSED
diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm
index 78512bf09c..bbaa5fab33 100644
--- a/code/modules/vore/eating/digest_act_vr.dm
+++ b/code/modules/vore/eating/digest_act_vr.dm
@@ -49,7 +49,7 @@
. = ..()
/obj/item/weapon/card/id/digest_act(var/atom/movable/item_storage = null)
- desc = "A partially digested card that has seen better days. Much of it's data has been destroyed."
+ desc = "A partially digested card that has seen better days. Much of it's data has been destroyed, but the card itself is still completely salvageable. Please recycle it at crew resources office."
icon = 'icons/obj/card_vr.dmi'
icon_state = "digested"
access = list() // No access
@@ -82,7 +82,7 @@
/obj/item/weapon/storage/digest_act(var/atom/movable/item_storage = null)
for(var/obj/item/I in contents)
I.screen_loc = null
-
+
. = ..()
/////////////
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index d3f37842bf..0d50650924 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -18,7 +18,7 @@
var/dat = picker_holder.gen_ui(src)
- picker_holder.popup = new(src, "insidePanel","Inside!", 400, 600, picker_holder)
+ picker_holder.popup = new(src, "insidePanel","Inside!", 450, 700, picker_holder)
picker_holder.popup.set_content(dat)
picker_holder.popup.open()
src.openpanel = 1
@@ -31,7 +31,7 @@
var/dat = picker_holder.gen_ui(src)
- picker_holder.popup = new(src, "insidePanel","Inside!", 400, 600, picker_holder)
+ picker_holder.popup = new(src, "insidePanel","Inside!", 450, 700, picker_holder)
picker_holder.popup.set_content(dat)
picker_holder.popup.open()
@@ -110,46 +110,44 @@
spanstyle = ""
if(DM_DIGEST)
spanstyle = "color:red;"
- if(DM_ITEMWEAK)
- spanstyle = "color:red;"
- if(DM_STRIPDIGEST)
- spanstyle = "color:red;"
- if(DM_HEAL)
- spanstyle = "color:green;"
if(DM_ABSORB)
spanstyle = "color:purple;"
if(DM_DRAIN)
spanstyle = "color:purple;"
+ if(DM_HEAL)
+ spanstyle = "color:green;"
if(DM_SHRINK)
spanstyle = "color:purple;"
if(DM_GROW)
spanstyle = "color:purple;"
if(DM_SIZE_STEAL)
spanstyle = "color:purple;"
- if(DM_TRANSFORM_MALE)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_HAIR_AND_EYES)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_FEMALE)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_KEEP_GENDER)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_REPLICA)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_REPLICA_EGG)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_KEEP_GENDER_EGG)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_MALE_EGG)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_FEMALE_EGG)
- spanstyle = "color:purple;"
- if(DM_EGG)
- spanstyle = "color:purple;"
+ if(DM_TRANSFORM)
+ switch(B.tf_mode)
+ if(DM_TRANSFORM_MALE)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_HAIR_AND_EYES)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_FEMALE)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_KEEP_GENDER)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_REPLICA)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_REPLICA_EGG)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_KEEP_GENDER_EGG)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_MALE_EGG)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_FEMALE_EGG)
+ spanstyle = "color:purple;"
+ if(DM_EGG)
+ spanstyle = "color:purple;"
dat += " ([B.contents.len])"
@@ -193,7 +191,19 @@
//Digest Mode Button
dat += "
Belly Mode:"
- dat += " [selected.digest_mode]"
+ var/mode = selected.digest_mode
+ dat += " [mode == DM_TRANSFORM ? selected.tf_mode : mode]"
+
+ //Mode addons button
+ dat += "
Mode Addons:"
+ var/list/flag_list = list()
+ for(var/flag_name in selected.mode_flag_list)
+ if(selected.mode_flags & selected.mode_flag_list[flag_name])
+ flag_list += flag_name
+ if(flag_list.len)
+ dat += " [english_list(flag_list)]"
+ else
+ dat += " None"
//Belly verb
dat += "
Vore Verb:"
@@ -499,14 +509,30 @@
if(href_list["b_mode"])
var/list/menu_list = selected.digest_modes
if(istype(usr,/mob/living/carbon/human))
- menu_list += selected.transform_modes
+ menu_list += DM_TRANSFORM
var/new_mode = input("Choose Mode (currently [selected.digest_mode])") as null|anything in menu_list
if(!new_mode)
return 0
+
+ if(new_mode == DM_TRANSFORM) //Snowflek submenu
+ var/list/tf_list = selected.transform_modes
+ var/new_tf_mode = input("Choose TF Mode (currently [selected.tf_mode])") as null|anything in tf_list
+ if(!new_tf_mode)
+ return 0
+ selected.tf_mode = new_tf_mode
+
selected.digest_mode = new_mode
selected.items_preserved.Cut() //Re-evaltuate all items in belly on belly-mode change
+ if(href_list["b_addons"])
+ var/list/menu_list = selected.mode_flag_list
+ var/toggle_addon = input("Toggle Addon") as null|anything in menu_list
+ if(!toggle_addon)
+ return 0
+ selected.mode_flags ^= selected.mode_flag_list[toggle_addon]
+ selected.items_preserved.Cut() //Re-evaltuate all items in belly on addon toggle
+
if(href_list["b_desc"])
var/new_desc = html_encode(input(usr,"Belly Description ([BELLIES_DESC_MAX] char limit):","New Description",selected.desc) as message|null)
diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm
index 45ac6dd99e..c903dec636 100644
--- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm
@@ -1760,3 +1760,40 @@ Departamental Swimsuits, for general use
icon_state = "tronsiren_shoes"
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_override = 'icons/vore/custom_onmob_vr.dmi'
+
+/obj/item/clothing/head/helmet/space/void/security/hasd
+ name = "HASD EVA faceplate"
+ desc = "It's a faceplate that slots into the HASD EVA bodyplate assembly. Functionally useless alone."
+
+ icon = 'icons/vore/custom_clothes_vr.dmi'
+ icon_state = "hasd_helm"
+
+ icon_override = 'icons/vore/custom_clothes_vr.dmi'
+ item_state = "hasd_helm"
+ species_restricted = null
+
+ mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
+ if(..())
+ if(H.ckey != "silencedmp5a5")
+ H << "...The faceplate is clearly not made for your anatomy, thus, does not fit."
+ return 0
+ else
+ return 1
+
+/obj/item/clothing/suit/space/void/security/hasd
+ name = "HASD EVA bodyplates"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ desc = "A series of armor plates painted black, deployed from a back-mounted module. They fit smoothly over the unit's armor plates and projects a skintight bubble shield over the unit's uncovered parts. Faceplate and coolant unit not included."
+ species_restricted = null
+ icon = 'icons/mob/taursuits_vr.dmi'
+ icon_override = 'icons/mob/taursuits_vr.dmi'
+ icon_state = "hasd_suit"
+ item_state = "hasd_suit"
+ pixel_x = -16
+
+ mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
+ if(..() && istype(H) && H.ckey == "silencedmp5a5" && istype(H.tail_style, /datum/sprite_accessory/tail/taur/lizard/synthlizard))
+ return 1
+ else
+ H << "This suit is not designed for you."
+ return 0
diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index 5dd7f8f492..44c392eb43 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -1901,7 +1901,7 @@
user.visible_message(pick("\The [user] is slitting \his stomach open with \the [src]! It looks like [tempgender] trying to commit seppuku.",\
"\The [user] is falling on \the [src]! It looks like [tempgender] trying to commit suicide."))
return (BRUTELOSS|FIRELOSS)
-
+
/obj/item/weapon/melee/fluffstuff/awoosword
name = "Wolfgirl Sword Replica"
desc = "A replica of a large, scimitar-like sword with a dull edge. Ceremonial... until it isn't."
@@ -1945,3 +1945,15 @@
..()
attack_verb = list("bapped", "thwapped", "bonked", "whacked")
icon_state = initial(icon_state)
+
+//SilencedMP5A5 - Serdykov Antoz
+/obj/item/device/modkit_conversion/hasd
+ name = "HASD EVA modification kit"
+ desc = "A kit containing all the needed tools and parts to modify a suit and helmet into something a HASD unit can use for EVA operations."
+ icon = 'icons/vore/custom_items_vr.dmi'
+ icon_state = "modkit"
+
+ from_helmet = /obj/item/clothing/head/helmet/space/void/security
+ from_suit = /obj/item/clothing/suit/space/void/security/taur
+ to_helmet = /obj/item/clothing/head/helmet/space/void/security/hasd
+ to_suit = /obj/item/clothing/suit/space/void/security/hasd
\ No newline at end of file
diff --git a/config/custom_items.txt b/config/custom_items.txt
index 18c0685224..a81ee5bd5e 100644
--- a/config/custom_items.txt
+++ b/config/custom_items.txt
@@ -703,6 +703,13 @@ item_path: /obj/item/clothing/glasses/sunglasses/fluff/alfonso
#req_access = 1
#}
+#{
+#ckey: silencedmp5a5
+#character_name: NT-HASD #556
+#item_path: /obj/item/device/modkit_conversion/hasd
+#req_access = 1
+#}
+
{
ckey: silvertalismen
character_name: Tasy Ruffles
@@ -879,25 +886,25 @@ item_path: /obj/item/clothing/head/welding/fluff/vinjj
{
ckey: wickedtemp
-character_name: Chakat Tempest
+character_name: Chakat Tempest Venesare
item_path: /obj/item/clothing/glasses/omnihud/med/fluff/wickedtemphud
}
{
ckey: wickedtemp
-character_name: Chakat Tempest
+character_name: Chakat Tempest Venesare
item_path: /obj/item/weapon/reagent_containers/hypospray/vial/tempest
}
{
ckey: wickedtemp
-character_name: Chakat Tempest
+character_name: Chakat Tempest Venesare
item_path: /obj/item/weapon/storage/backpack/saddlebag/tempest
}
{
ckey: wickedtemp
-character_name: Chakat Tempest
+character_name: Chakat Tempest Venesare
item_path: /obj/item/weapon/implanter/reagent_generator/tempest
}
diff --git a/icons/mob/back_vr.dmi b/icons/mob/back_vr.dmi
index c613fbe7dc..3e0884110e 100644
Binary files a/icons/mob/back_vr.dmi and b/icons/mob/back_vr.dmi differ
diff --git a/icons/mob/taursuits_vr.dmi b/icons/mob/taursuits_vr.dmi
index effe15809e..a8e376bfcb 100644
Binary files a/icons/mob/taursuits_vr.dmi and b/icons/mob/taursuits_vr.dmi differ
diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi
index cfc01a6962..7394423790 100644
Binary files a/icons/mob/vore/taurs_vr.dmi and b/icons/mob/vore/taurs_vr.dmi differ
diff --git a/icons/mob/vore64x32.dmi b/icons/mob/vore64x32.dmi
index 455a1e3bf3..8302072f35 100644
Binary files a/icons/mob/vore64x32.dmi and b/icons/mob/vore64x32.dmi differ
diff --git a/icons/turf/flooring/carpet_vr.dmi b/icons/turf/flooring/carpet_vr.dmi
deleted file mode 100644
index 9db7acc72f..0000000000
Binary files a/icons/turf/flooring/carpet_vr.dmi and /dev/null differ
diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi
index 0108556742..5cd12ac238 100644
Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 5445f1b708..bd51a6c376 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2195,6 +2195,7 @@
#include "code\modules\mob\living\simple_animal\vore\jelly.dm"
#include "code\modules\mob\living\simple_animal\vore\otie.dm"
#include "code\modules\mob\living\simple_animal\vore\panther.dm"
+#include "code\modules\mob\living\simple_animal\vore\rous.dm"
#include "code\modules\mob\living\simple_animal\vore\snake.dm"
#include "code\modules\mob\living\simple_animal\vore\solargrub.dm"
#include "code\modules\mob\living\simple_animal\vore\solargrub_larva.dm"
@@ -2716,6 +2717,7 @@
#include "code\modules\vore\appearance\update_icons_vr.dm"
#include "code\modules\vore\eating\belly_dat_vr.dm"
#include "code\modules\vore\eating\belly_obj_vr.dm"
+#include "code\modules\vore\eating\bellymodes_tf_vr.dm"
#include "code\modules\vore\eating\bellymodes_vr.dm"
#include "code\modules\vore\eating\contaminate_vr.dm"
#include "code\modules\vore\eating\digest_act_vr.dm"