Merge branch 'master' of https://github.com/VOREStation/VOREStation into patch-16
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
#define isbelly(A) istype(A, /obj/belly)
|
||||
#define isstorage(A) istype(A, /obj/item/weapon/storage)
|
||||
#define isstorage(A) istype(A, /obj/item/weapon/storage)
|
||||
#define isitem(A) istype(A, /obj/item)
|
||||
|
||||
@@ -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)
|
||||
//////////////////////////////
|
||||
|
||||
@@ -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, "<span class='danger'>There's already an item on this wall!</span>")
|
||||
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
|
||||
|
||||
@@ -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 << "<span class='warning'>APC cannot be placed on this spot.</span>"
|
||||
to_chat(user, "<span class='warning'>APC cannot be placed on this spot.</span>")
|
||||
return
|
||||
if (A.requires_power == 0 || istype(A, /area/space))
|
||||
usr << "<span class='warning'>APC cannot be placed in this area.</span>"
|
||||
to_chat(user, "<span class='warning'>APC cannot be placed in this area.</span>")
|
||||
return
|
||||
if (A.get_apc())
|
||||
usr << "<span class='warning'>This area already has an APC.</span>"
|
||||
to_chat(user, "<span class='warning'>This area already has an APC.</span>")
|
||||
return //only one APC per area
|
||||
for(var/obj/machinery/power/terminal/T in loc)
|
||||
if (T.master)
|
||||
usr << "<span class='warning'>There is another network terminal here.</span>"
|
||||
to_chat(user, "<span class='warning'>There is another network terminal here.</span>")
|
||||
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)
|
||||
|
||||
@@ -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 << "<span class='warning'>[no_message]</span>"
|
||||
return 0
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
can_paint = null
|
||||
|
||||
@@ -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 ****
|
||||
//**** Here ends snow ****
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
else
|
||||
H << "<span class='warning'>You need to have a horse, wolf, or naga half to wear this.</span>"
|
||||
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 << "<span class='warning'>You need to have a horse, wolf, or naga half to wear this.</span>"
|
||||
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."
|
||||
|
||||
@@ -220,7 +220,6 @@
|
||||
to_chat(temporary_form,"<span class='warning'>You need to regenerate more nanites first!</span>")
|
||||
else if(temporary_form.stat)
|
||||
to_chat(temporary_form,"<span class='warning'>You can only do this while not stunned.</span>")
|
||||
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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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("<span class='warning'>[hound.name]'s internal analyzer groans lightly as [target.name] slips inside.</span>", "<span class='notice'>Your internal analyzer groans lightly as [target] slips inside.</span>")
|
||||
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("<span class='warning'>[hound.name]'s internal analyzer groans lightly as [trashman] slips inside.</span>", "<span class='notice'>Your internal analyzer groans lightly as [trashman] slips inside.</span>")
|
||||
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("<span class='warning'>[hound.name]'s garbage processor groans lightly as [target.name] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [target] slips inside.</span>")
|
||||
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("<span class='warning'>[hound.name]'s garbage processor groans lightly as [trashmouse] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [trashmouse] slips inside.</span>")
|
||||
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("<span class='warning'>[hound.name]'s garbage processor groans lightly as [trashman] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [trashman] slips inside.</span>")
|
||||
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("<span class='warning'>[hound.name]'s medical pod lights up as [H.name] slips inside into their [src.name].</span>", "<span class='notice'>Your medical pod lights up as [H] slips into your [src]. Life support functions engaged.</span>")
|
||||
message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[hound.x];Y=[hound.y];Z=[hound.z]'>JMP</a>" : "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, "<span class='notice'>Your [src.name] is now clean. Ending self-cleaning cycle.</span>")
|
||||
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
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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!"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
@@ -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!",
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -243,4 +243,6 @@
|
||||
for(var/belly in vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
B.digest_mode = safe ? DM_HOLD : vore_default_mode
|
||||
|
||||
|
||||
/mob/living/simple_animal/mouse
|
||||
faction = "mouse" //Giving mice a faction so certain mobs can get along with them.
|
||||
@@ -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"
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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,"<span class='notice'>[owner]'s [lowertext(name)] absorbs your body, making you part of them.</span>")
|
||||
to_chat(owner,"<span class='notice'>Your [lowertext(name)] absorbs [M]'s body, making them part of you.</span>")
|
||||
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,"<span class='warning'>In response to your struggling, \the [lowertext(name)] begins to get more active...</span>")
|
||||
to_chat(owner,"<span class='warning'>You feel your [lowertext(name)] beginning to become active!</span>")
|
||||
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,"<span class='warning'>In response to your struggling, \the [lowertext(name)] begins to get even more active!</span>")
|
||||
to_chat(owner,"<span class='warning'>You feel your [lowertext(name)] beginning to become even more active!</span>")
|
||||
digest_mode = DM_DIGEST
|
||||
return
|
||||
|
||||
else //Nothing interesting happened.
|
||||
to_chat(R,"<span class='warning'>You make no progress in escaping [owner]'s [lowertext(name)].</span>")
|
||||
to_chat(owner,"<span class='warning'>Your prey appears to be unable to make any progress in escaping your [lowertext(name)].</span>")
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,"<span class='notice'>[pick(EL)]</span>")
|
||||
|
||||
/////////////////////////// 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,"<span class='notice'>You suddenly feel solid again </span>")
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
. = ..()
|
||||
|
||||
/////////////
|
||||
|
||||
@@ -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 += "<span style='[spanstyle]'> ([B.contents.len])</span></a></li>"
|
||||
|
||||
@@ -193,7 +191,19 @@
|
||||
|
||||
//Digest Mode Button
|
||||
dat += "<br><a href='?src=\ref[src];b_mode=\ref[selected]'>Belly Mode:</a>"
|
||||
dat += " [selected.digest_mode]"
|
||||
var/mode = selected.digest_mode
|
||||
dat += " [mode == DM_TRANSFORM ? selected.tf_mode : mode]"
|
||||
|
||||
//Mode addons button
|
||||
dat += "<br><a href='?src=\ref[src];b_addons=\ref[selected]'>Mode Addons:</a>"
|
||||
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 += "<br><a href='?src=\ref[src];b_verb=\ref[selected]'>Vore Verb:</a>"
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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 << "<span class='warning'>...The faceplate is clearly not made for your anatomy, thus, does not fit.</span>"
|
||||
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 << "<span class='warning'>This suit is not designed for you.</span>"
|
||||
return 0
|
||||
|
||||
@@ -1901,7 +1901,7 @@
|
||||
user.visible_message(pick("<span class='danger'>\The [user] is slitting \his stomach open with \the [src]! It looks like [tempgender] trying to commit seppuku.</span>",\
|
||||
"<span class='danger'>\The [user] is falling on \the [src]! It looks like [tempgender] trying to commit suicide.</span>"))
|
||||
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
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 252 KiB After Width: | Height: | Size: 255 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 282 KiB After Width: | Height: | Size: 294 KiB |
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 193 KiB |
@@ -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"
|
||||
|
||||