@@ -29,9 +29,10 @@
|
||||
#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)"
|
||||
|
||||
//Addon mode flags
|
||||
#define DM_FLAG_NUMBING 0x1
|
||||
#define DM_FLAG_ITEMWEAK 0x2
|
||||
#define DM_FLAG_STRIPPING 0x4
|
||||
#define DM_FLAG_NUMBING 0x1
|
||||
#define DM_FLAG_STRIPPING 0x2
|
||||
#define DM_FLAG_LEAVEREMAINS 0x4 //TFF 30/4/19: Ports VoreStation Remains Option - new belly mode
|
||||
#define DM_FLAG_ITEMWEAK 0x8
|
||||
|
||||
// Stance for hostile mobs to be in while devouring someone.
|
||||
#define HOSTILE_STANCE_EATING 99
|
||||
|
||||
@@ -27,3 +27,10 @@
|
||||
#define SPECIES_ZORREN_FLAT "Flatland Zorren"
|
||||
#define SPECIES_ZORREN_HIGH "Highlander Zorren"
|
||||
#define SPECIES_CUSTOM "Custom Species"
|
||||
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option - new mob defines
|
||||
|
||||
#define SPECIES_MONKEY_AKULA "Sobaka"
|
||||
#define SPECIES_MONKEY_NEVREAN "Sparra"
|
||||
#define SPECIES_MONKEY_SERGAL "Saru"
|
||||
#define SPECIES_MONKEY_VULPKANIN "Wolpin"
|
||||
|
||||
@@ -372,6 +372,27 @@ var/global/list/cont_flavors_musky = list("drenched",
|
||||
"sticky",
|
||||
"tainted")
|
||||
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option - sets species that won't result in remains left behind
|
||||
var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
|
||||
SPECIES_DIONA,
|
||||
SPECIES_ALRAUNE,
|
||||
SPECIES_PROTEAN,
|
||||
SPECIES_MONKEY, //Exclude all monkey subtypes, to prevent abuse of it. They aren't,
|
||||
SPECIES_MONKEY_TAJ, //set to have remains anyway, but making double sure,
|
||||
SPECIES_MONKEY_SKRELL,
|
||||
SPECIES_MONKEY_UNATHI,
|
||||
SPECIES_MONKEY_AKULA,
|
||||
SPECIES_MONKEY_NEVREAN,
|
||||
SPECIES_MONKEY_SERGAL,
|
||||
SPECIES_MONKEY_VULPKANIN,
|
||||
SPECIES_XENO, //Same for xenos,
|
||||
SPECIES_XENO_DRONE,
|
||||
SPECIES_XENO_HUNTER,
|
||||
SPECIES_XENO_SENTINEL,
|
||||
SPECIES_XENO_QUEEN,
|
||||
SPECIES_SHADOW,
|
||||
SPECIES_GOLEM) //Some special species that may or may not be ever used in event too
|
||||
|
||||
/hook/startup/proc/init_vore_datum_ref_lists()
|
||||
var/paths
|
||||
|
||||
|
||||
@@ -506,6 +506,11 @@
|
||||
//visible_message("<span class='notice'>\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.</span>", 3)
|
||||
visible_message("<span class='notice'>\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2].</span>", 3)
|
||||
|
||||
//TFF: Port Vorestation fix for people getting kicked while inside a belly. Re-added 1/5/19. Didn't synch my fork before that last one, apparently. >W>
|
||||
if(to_despawn.client && to_despawn.stat<2)
|
||||
var/mob/observer/dead/newghost = to_despawn.ghostize()
|
||||
newghost.timeofdeath = world.time
|
||||
|
||||
//This should guarantee that ghosts don't spawn.
|
||||
to_despawn.ckey = null
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
set name = "Quick NIF"
|
||||
set desc = "Spawns a NIF into someone in quick-implant mode."
|
||||
|
||||
if(!check_rights(R_ADMIN || R_EVENT))
|
||||
if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG)) //TFF 24/4/19: Allow Devs to use Quick-NIF verb.
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = input("Pick a mob with a player","Quick NIF") as null|anything in player_list
|
||||
|
||||
@@ -30,6 +30,11 @@
|
||||
display_name = "collar, holo"
|
||||
path = /obj/item/clothing/accessory/collar/holo
|
||||
|
||||
//TFF 23/4/19: Indigestible collar addition
|
||||
/datum/gear/collar/holo/indigestible
|
||||
display_name = "collar, holo (indigestible)"
|
||||
path = /obj/item/clothing/accessory/collar/holo/indigestible
|
||||
|
||||
/datum/gear/accessory/white_drop_pouches
|
||||
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist")
|
||||
|
||||
@@ -53,4 +58,4 @@
|
||||
|
||||
/datum/gear/accessory/flops/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
@@ -12,4 +12,8 @@
|
||||
|
||||
/datum/gear/eyes/science_proper
|
||||
display_name = "science goggles (no overlay)"
|
||||
path = /obj/item/clothing/glasses/fluff/science_proper
|
||||
path = /obj/item/clothing/glasses/fluff/science_proper
|
||||
|
||||
datum/gear/eyes/flipgoggles
|
||||
display_name = "Flip Goggles"
|
||||
path = /obj/item/clothing/glasses/goggles/flip
|
||||
@@ -0,0 +1,29 @@
|
||||
//TFF 29/4/19: Add implants category, includes reagent implanters
|
||||
|
||||
|
||||
/datum/gear/implant
|
||||
display_name = "implant, tracking"
|
||||
path = /obj/item/weapon/implant/tracking/weak
|
||||
cost = 0 //VOREStation Edit. Changed cost to 0
|
||||
slot = "implant"
|
||||
exploitable = 1
|
||||
sort_category = "Implants"
|
||||
|
||||
/* VOREStation Edit - Make languages great again
|
||||
/datum/gear/utility/implant/eal //This does nothing if you don't actually know EAL.
|
||||
display_name = "implant, language, EAL"
|
||||
path = /obj/item/weapon/implant/language/eal
|
||||
cost = 2
|
||||
slot = "implant"
|
||||
exploitable = 1*/
|
||||
|
||||
//Reagent implants - cost of 2 to reduce chance of abuse
|
||||
/datum/gear/implant/reagent_generator
|
||||
display_name = "implant, milk production"
|
||||
path = /obj/item/weapon/implanter/reagent_generator/milk
|
||||
exploitable = 0
|
||||
cost = 2
|
||||
|
||||
/datum/gear/implant/reagent_generator/egg
|
||||
display_name = "implant, egg production"
|
||||
path = /obj/item/weapon/implanter/reagent_generator/egg
|
||||
@@ -12,4 +12,10 @@
|
||||
|
||||
/datum/gear/shoes/siren
|
||||
display_name = "boots, Siren"
|
||||
path = /obj/item/clothing/shoes/boots/fluff/siren
|
||||
path = /obj/item/clothing/shoes/boots/fluff/siren
|
||||
|
||||
/datum/gear/shoes/tall
|
||||
display_name = "tall jackboots"
|
||||
path = /obj/item/clothing/shoes/boots/jackboots/tall
|
||||
slot = slot_shoes
|
||||
sort_category = "Shoes and Footwear"
|
||||
@@ -20,4 +20,8 @@
|
||||
|
||||
/datum/gear/suit/gntop
|
||||
display_name = "GN crop jacket"
|
||||
path = /obj/item/clothing/suit/storage/fluff/gntop
|
||||
path = /obj/item/clothing/suit/storage/fluff/gntop
|
||||
|
||||
/datum/gear/suit/denim_vest/black
|
||||
display_name = "black denim vest"
|
||||
path = /obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless/black
|
||||
@@ -115,22 +115,7 @@
|
||||
display_name = "cell, device"
|
||||
path = /obj/item/weapon/cell/device
|
||||
|
||||
/datum/gear/utility/implant
|
||||
exploitable = 1
|
||||
/* VOREStation Edit - Make languages great again
|
||||
/datum/gear/utility/implant/eal //This does nothing if you don't actually know EAL.
|
||||
display_name = "implant, language, EAL"
|
||||
path = /obj/item/weapon/implant/language/eal
|
||||
cost = 2
|
||||
slot = "implant"
|
||||
exploitable = 1*/
|
||||
|
||||
/datum/gear/utility/implant/tracking
|
||||
display_name = "implant, tracking"
|
||||
path = /obj/item/weapon/implant/tracking/weak
|
||||
cost = 0 //VOREStation Edit. Changed cost to 0
|
||||
slot = "implant"
|
||||
exploitable = 1
|
||||
//TFF 29/4/19: remove implants, move to loadout_implants.dm
|
||||
|
||||
/datum/gear/utility/pen
|
||||
display_name = "Fountain Pen"
|
||||
|
||||
@@ -165,6 +165,15 @@
|
||||
overlay_state = "collar_holo_overlay"
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 50)
|
||||
|
||||
//TFF 23/4/19: Indigestible collar addition
|
||||
/obj/item/clothing/accessory/collar/holo/indigestible
|
||||
name = "Holo-collar"
|
||||
desc = "A special variety of the holo-collar that seems to be made of a very durable fabric that fits around the neck."
|
||||
icon_state = "collar_holo"
|
||||
item_state = "collar_holo_overlay"
|
||||
overlay_state = "collar_holo_overlay"
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 50)
|
||||
|
||||
// Chompstation edit - Deprecated, implementing a custom method of renaming collars.
|
||||
/*
|
||||
/obj/item/clothing/accessory/collar/holo/attack_self(mob/user as mob)
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
|
||||
if(update) UpdateDamageIcon()
|
||||
|
||||
/mob/living/carbon/human/proc/implant_loadout(var/datum/gear/G = new/datum/gear/utility/implant)
|
||||
/mob/living/carbon/human/proc/implant_loadout(var/datum/gear/G = new/datum/gear/implant) //TFF 29/4/19: filepath change due to loadout change
|
||||
var/obj/item/weapon/implant/I = new G.path(src)
|
||||
I.imp_in = src
|
||||
I.implanted = 1
|
||||
|
||||
@@ -117,8 +117,8 @@
|
||||
amount *= M.incoming_damage_percent
|
||||
if(!isnull(M.incoming_brute_damage_percent))
|
||||
amount *= M.incoming_brute_damage_percent
|
||||
if(nif && nif.flag_check(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage
|
||||
take_overall_damage(amount, 0)
|
||||
if(nif && nif.flag_check(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT))
|
||||
take_overall_damage(amount *= 0.7, 0) //VOREStation Edit - NIF mod for damage resistance for this type of damage
|
||||
else
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(!isnull(M.incoming_healing_percent))
|
||||
@@ -135,8 +135,8 @@
|
||||
amount *= M.incoming_damage_percent
|
||||
if(!isnull(M.incoming_fire_damage_percent))
|
||||
amount *= M.incoming_fire_damage_percent
|
||||
if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage
|
||||
take_overall_damage(0, amount)
|
||||
if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT))
|
||||
take_overall_damage(0, amount *= 0.7) //VOREStation Edit - NIF mod for damage resistance for this type of damage
|
||||
else
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(!isnull(M.incoming_healing_percent))
|
||||
@@ -177,8 +177,8 @@
|
||||
amount *= M.incoming_damage_percent
|
||||
if(!isnull(M.incoming_fire_damage_percent))
|
||||
amount *= M.incoming_fire_damage_percent
|
||||
if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage
|
||||
O.take_damage(0, amount, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source)
|
||||
if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT))
|
||||
O.take_damage(0, amount *= 0.7, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) //VOREStation Edit - NIF mod for damage resistance for this type of damage
|
||||
else
|
||||
for(var/datum/modifier/M in modifiers)
|
||||
if(!isnull(M.incoming_healing_percent))
|
||||
|
||||
@@ -1,15 +1,19 @@
|
||||
//TFF 30/4/19: Make leave_remains_vr.dm work! >:C
|
||||
|
||||
/datum/species
|
||||
//var/vore_numbing = 0
|
||||
var/gets_food_nutrition = 1 // If this is set to 0, the person can't get nutrition from food.
|
||||
var/gets_food_nutrition = TRUE // If this is set to 0, the person can't get nutrition from food.
|
||||
var/metabolism = 0.0015
|
||||
var/lightweight = 0 //Oof! Nonhelpful bump stumbles.
|
||||
var/trashcan = 0 //It's always sunny in the wrestling ring.
|
||||
var/lightweight = FALSE //Oof! Nonhelpful bump stumbles.
|
||||
var/trashcan = FALSE //It's always sunny in the wrestling ring.
|
||||
var/base_species = null // Unused outside of a few species
|
||||
var/selects_bodytype = 0 // Allows the species to choose from body types intead of being forced to be just one.
|
||||
|
||||
/datum/species/custom
|
||||
name = SPECIES_CUSTOM
|
||||
name_plural = "Custom"
|
||||
var/base_species = "Human"
|
||||
selects_bodytype = TRUE
|
||||
base_species = SPECIES_HUMAN
|
||||
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option - refactor species names
|
||||
/datum/species/monkey/shark
|
||||
name = "Sobaka"
|
||||
name = SPECIES_MONKEY_AKULA
|
||||
name_plural = "Sobaka"
|
||||
icobase = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
|
||||
deform = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
|
||||
@@ -8,7 +9,7 @@
|
||||
default_language = "Skrellian" //Closest we have.
|
||||
|
||||
/datum/species/monkey/sergal
|
||||
name = "Saru"
|
||||
name = SPECIES_MONKEY_SERGAL
|
||||
greater_form = "Sergal"
|
||||
icobase = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
|
||||
deform = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
|
||||
@@ -16,7 +17,7 @@
|
||||
default_language = LANGUAGE_SAGARU
|
||||
|
||||
/datum/species/monkey/sparra
|
||||
name = "Sparra"
|
||||
name = SPECIES_MONKEY_NEVREAN
|
||||
name_plural = "Sparra"
|
||||
greater_form = "Nevrean"
|
||||
tail = null
|
||||
@@ -41,7 +42,7 @@
|
||||
*/
|
||||
|
||||
/datum/species/monkey/vulpkanin
|
||||
name = "Wolpin"
|
||||
name = SPECIES_MONKEY_VULPKANIN
|
||||
name_plural = "Wolpin"
|
||||
|
||||
icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
|
||||
|
||||
@@ -14,7 +14,9 @@
|
||||
slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari.
|
||||
brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though.
|
||||
burn_mod = 1.15 //As vulnerable to burn as a Tajara.
|
||||
var/base_species = "Xenochimera"
|
||||
//TFF 30/4/19: Making leave_remains_vr.dm work. >:C
|
||||
base_species = "Xenochimera"
|
||||
selects_bodytype = TRUE
|
||||
|
||||
num_alternate_languages = 2
|
||||
secondary_langs = list("Sol Common")
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
minbodytemp = 0
|
||||
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
|
||||
//TFF 30/4/19: Port VoreStation Mechanical Vore Prefs - hide Mimic prefs
|
||||
showvoreprefs = 0 //VOREStation Edit - Hides mechanical vore prefs for mimics. You can't see their gaping maws when they're just sitting idle.
|
||||
|
||||
/mob/living/simple_animal/hostile/mimic/set_target()
|
||||
. = ..()
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
/mob/living/simple_animal/sculpture
|
||||
name = "\improper sculpture"
|
||||
desc = "It's some kind of hastily-painted human-size stone sculpture. Just looking at it makes you feel nervous."
|
||||
icon = 'icons/mob/sculpture.dmi'
|
||||
icon_state = "sculpture"
|
||||
icon_living = "sculpture"
|
||||
icon_dead = "sculpture"
|
||||
|
||||
@@ -3,4 +3,20 @@
|
||||
fire_delay = 4
|
||||
|
||||
/obj/item/weapon/gun/energy/stunrevolver
|
||||
charge_cost = 400
|
||||
charge_cost = 400
|
||||
|
||||
//CHOMPEDIT:
|
||||
/obj/item/weapon/gun/energy/stunrevolver/oneshot
|
||||
desc = "A heavily modified LAEP20 Zeus. It fires a beam instead of an electrode. The massive recoil makes it only useful as a last resort weapon."
|
||||
charge_cost = 2400
|
||||
projectile_type = /obj/item/projectile/beam/stun/oneshot
|
||||
|
||||
/obj/item/weapon/gun/energy/stunrevolver/oneshot/Fire(atom/target, mob/living/user, clickparams, pointblank=0, reflex=0)
|
||||
..()
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/nerd = user
|
||||
var/mysize = nerd.size_multiplier
|
||||
nerd.Weaken(3-mysize) //200% gets the knockdown micros usually get now from firing a gun. Micros get their base knockdown + this.
|
||||
nerd.adjustBruteLoss(10-mysize*4) //This means 200% = 10-8; 100% = 10-4; etc
|
||||
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
muzzle_type = /obj/effect/projectile/laser/muzzle
|
||||
tracer_type = /obj/effect/projectile/laser/tracer
|
||||
impact_type = /obj/effect/projectile/laser/impact
|
||||
|
||||
|
||||
/obj/item/projectile/beam/practice
|
||||
name = "laser"
|
||||
@@ -210,4 +211,12 @@
|
||||
/obj/item/projectile/beam/stun/med
|
||||
name = "stun beam"
|
||||
icon_state = "stun"
|
||||
agony = 35
|
||||
agony = 35
|
||||
|
||||
//CHOMPEDIT: Charge beam that drains all power
|
||||
/obj/item/projectile/beam/stun/oneshot
|
||||
name = "Overdrive Stun beam"
|
||||
light_color = "#AA00FF"
|
||||
//shotcost = 2400
|
||||
agony = 240
|
||||
//CHOMPEDIT END.
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
/datum/sprite_accessory/tail/taur/roiz_long_lizard // Not ACTUALLY a taur, but it uses 32x64 so it wouldn't fit in tails.dmi, and having it as a tail bugs up the sprite.
|
||||
name = "Long Lizard Tail (Roiz Lizden)"
|
||||
icon_state = "roiz_tail_s"
|
||||
do_colouration = 0
|
||||
do_colouration = 1 //TFF 25/4/19: Make colourable as per request.
|
||||
// ckeys_allowed = list("spoopylizz")
|
||||
|
||||
/datum/sprite_accessory/tail/taur/wolf
|
||||
@@ -399,6 +399,38 @@
|
||||
icon_state = "otie_s"
|
||||
extra_overlay = "otie_markings"
|
||||
|
||||
//TFF 25/4/19: Add Mermaid taur body selection. Requested addition!
|
||||
/datum/sprite_accessory/tail/taur/mermaid
|
||||
name = "Mermaid (Taur)"
|
||||
icon_state = "mermaid_s"
|
||||
|
||||
msg_owner_help_walk = "You carefully slide around %prey."
|
||||
msg_prey_help_walk = "%owner's huge fin slides past beside you!"
|
||||
|
||||
msg_owner_help_run = "You carefully slide around %prey."
|
||||
msg_prey_help_run = "%owner's huge fine slides past beside you!"
|
||||
|
||||
msg_owner_disarm_run = "Your fin comes up above %prey, pushing them down to the ground!"
|
||||
msg_prey_disarm_run = "%owner's fin comes up you, forcing you down to the ground!"
|
||||
|
||||
msg_owner_disarm_walk = "You push down on %prey with your fin, pinning them down under you!"
|
||||
msg_prey_disarm_walk = "%owner pushes down on you with their fin, pinning you down below them!"
|
||||
|
||||
msg_owner_harm_run = "While sliding across the ground, you go right over %prey, crushing them!"
|
||||
msg_prey_harm_run = "%owner slides over your body, carelessly crushing you with their heavy fin!"
|
||||
|
||||
msg_owner_harm_walk = "Your heavy fin slowly and methodically slides down upon %prey, crushing against the floor below!"
|
||||
msg_prey_harm_walk = "%owner's thick, heavy fin slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!"
|
||||
|
||||
msg_owner_grab_success = "You slide over %prey with your large, thick fin, smushing them against the ground before bending around them, trapping them between the base of the fin and the end of it!"
|
||||
msg_prey_grab_success = "%owner slithers over you with their large, thick fin, smushing you against the ground before bending around you, trapping you between the fin's base and the end of it!"
|
||||
|
||||
msg_owner_grab_fail = "You squish %prey under your large, thick fin, forcing them onto the ground!"
|
||||
msg_prey_grab_fail = "%owner pins you under their large, thick fin, forcing you onto the ground!"
|
||||
|
||||
msg_prey_stepunder = "You jump over %prey's thick fin."
|
||||
msg_owner_stepunder = "%owner bounds over your fin."
|
||||
|
||||
//wickedtemp: Chakat Tempest
|
||||
/datum/sprite_accessory/tail/taur/feline/tempest
|
||||
name = "Feline (wickedtemp) (Taur)"
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
//Actual full digest modes
|
||||
var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL)
|
||||
//Digest mode addon flags
|
||||
var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Itemweak" = DM_FLAG_ITEMWEAK, "Stripping" = DM_FLAG_STRIPPING)
|
||||
var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Itemweak" = DM_FLAG_ITEMWEAK, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS) //TFF 30/4/19: Ports VoreStation Remains Option - add new belly mode addon to toggle
|
||||
//Transformation modes
|
||||
var/tmp/static/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG)
|
||||
|
||||
@@ -259,10 +259,9 @@
|
||||
if(owner.stat == DEAD)
|
||||
return
|
||||
if(!prey.isEdible) //CHOMPEDIT: Trying to make pred mobs prey? N O U
|
||||
|
||||
|
||||
var/mob/living/simple_animal/preydator = prey
|
||||
|
||||
if(preydator.icon_state == preydator.icon_living && preydator.size_multiplier >= 1)
|
||||
if(preydator.icon_state == preydator.icon_living)
|
||||
user.visible_message("<span class='danger'>\the [user] promptly gets tackled by \the [prey] for trying to break their prefs! !</span>!")
|
||||
user.Weaken(5)
|
||||
if (preydator.will_eat(user))
|
||||
|
||||
@@ -113,6 +113,9 @@
|
||||
to_chat(M,"<span class='notice'>" + digest_alert_prey + "</span>")
|
||||
|
||||
play_sound = pick(death_sounds)
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option - handler to leave remains
|
||||
if((mode_flags & DM_FLAG_LEAVEREMAINS) && M.digest_leave_remains)
|
||||
handle_remains_leaving(M)
|
||||
digestion_death(M)
|
||||
owner.update_icons()
|
||||
if(compensation > 0)
|
||||
@@ -129,9 +132,9 @@
|
||||
if(istype(M,/mob/living/simple_animal/retaliate/synx))
|
||||
var/syntox = digest_brute+digest_burn
|
||||
owner.adjustToxLoss(syntox)
|
||||
M.adjustBruteLoss(-syntox*2) //Should automaticaly clamp to 0
|
||||
M.adjustFireLoss(-syntox*2) //Should automaticaly clamp to 0
|
||||
//END SYNX hook.
|
||||
if(M.health <= M.maxHealth)
|
||||
M.health = M.health + syntox*2
|
||||
|
||||
// Deal digestion damage (and feed the pred)
|
||||
var/old_brute = M.getBruteLoss()
|
||||
var/old_burn = M.getFireLoss()
|
||||
|
||||
@@ -39,7 +39,9 @@
|
||||
return FALSE //Sorta important to not digest your own beacons.
|
||||
/obj/item/weapon/storage/glass_ornament/digest_act(...)
|
||||
return FALSE
|
||||
|
||||
//TFF 23/4/19: Indigestible collar addition
|
||||
/obj/item/clothing/accessory/collar/holo/indigestible/digest_act(...)
|
||||
return FALSE
|
||||
/////////////
|
||||
// Some special treatment
|
||||
/////////////
|
||||
|
||||
@@ -0,0 +1,164 @@
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option - add new file to handle leaving some remains after digestion kills you
|
||||
/obj/belly/proc/handle_remains_leaving(var/mob/living/M)
|
||||
|
||||
if(istype(M,/mob/living/carbon/human)) //Are we even humanoid?
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if((H.species.name in remainless_species) || H.isSynthetic()) //Don't leave anything if there is nothing to leave
|
||||
return
|
||||
|
||||
else
|
||||
var/bones_amount = rand(2,3) //some random variety in amount of bones left
|
||||
|
||||
if(prob(20)) //ribcage surviving whole is some luck
|
||||
new /obj/item/weapon/digestion_remains/ribcage(src,owner)
|
||||
bones_amount--
|
||||
|
||||
while(bones_amount) //throw in the rest
|
||||
new /obj/item/weapon/digestion_remains(src,owner)
|
||||
bones_amount--
|
||||
|
||||
var/skull_amount = 1
|
||||
switch(H.species.name) //oh boy here we go, finding us a right skull
|
||||
if(SPECIES_HUMAN)
|
||||
new /obj/item/weapon/digestion_remains/skull(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_TAJ)
|
||||
new /obj/item/weapon/digestion_remains/skull/tajaran(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_UNATHI)
|
||||
new /obj/item/weapon/digestion_remains/skull/unathi(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_SKRELL)
|
||||
new /obj/item/weapon/digestion_remains/skull/skrell(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_VASILISSAN)
|
||||
new /obj/item/weapon/digestion_remains/skull/vasilissan(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_AKULA)
|
||||
new /obj/item/weapon/digestion_remains/skull/akula(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_RAPALA)
|
||||
new /obj/item/weapon/digestion_remains/skull/rapala(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_VULPKANIN)
|
||||
new /obj/item/weapon/digestion_remains/skull/vulpkanin(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_SERGAL)
|
||||
new /obj/item/weapon/digestion_remains/skull/sergal(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_ZORREN_FLAT || SPECIES_ZORREN_HIGH)
|
||||
new /obj/item/weapon/digestion_remains/skull/zorren(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_NEVREAN)
|
||||
new /obj/item/weapon/digestion_remains/skull/nevrean(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_TESHARI)
|
||||
new /obj/item/weapon/digestion_remains/skull/teshari(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_VOX)
|
||||
new /obj/item/weapon/digestion_remains/skull/vox(src,owner)
|
||||
skull_amount--
|
||||
if(SPECIES_XENOHYBRID)
|
||||
new /obj/item/weapon/digestion_remains/skull/xenohybrid(src,owner)
|
||||
skull_amount--
|
||||
if(skull_amount && H.species.selects_bodytype) //We still haven't found correct skull...
|
||||
if(H.species.base_species == SPECIES_HUMAN)
|
||||
new /obj/item/weapon/digestion_remains/skull/unknown(src,owner)
|
||||
else
|
||||
new /obj/item/weapon/digestion_remains/skull/unknown/anthro(src,owner)
|
||||
else if(skull_amount) //Something entirely different...
|
||||
new /obj/item/weapon/digestion_remains/skull/unknown(src,owner)
|
||||
else
|
||||
return
|
||||
|
||||
/obj/item/weapon/digestion_remains
|
||||
name = "bone"
|
||||
desc = "A bleached bone. It's very non-descript and its hard to tell what species or part of the body it came from."
|
||||
icon = 'icons/obj/bones_vr.dmi'
|
||||
icon_state = "generic"
|
||||
force = 0
|
||||
throwforce = 0
|
||||
item_state = "bone"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
var/pred_ckey
|
||||
var/pred_name
|
||||
|
||||
/obj/item/weapon/digestion_remains/New(var/newloc,var/mob/living/pred)
|
||||
..(newloc)
|
||||
pred_ckey = pred.ckey
|
||||
pred_name = pred.name
|
||||
|
||||
/obj/item/weapon/digestion_remains/attack_self(mob/user)
|
||||
if(user.a_intent == I_HURT)
|
||||
to_chat(user,"<span class='warning'>As you squeeze the [name], it crumbles into dust and falls apart into nothing!</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/digestion_remains/ribcage
|
||||
name = "ribcage"
|
||||
desc = "A bleached ribcage. It's very white and definitely has seen better times. Hard to tell what it belonged to."
|
||||
icon_state = "ribcage"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull
|
||||
name = "skull"
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to a human."
|
||||
icon_state = "skull"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/tajaran
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to a tajara."
|
||||
icon_state = "skull_taj"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/unathi
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to an unathi."
|
||||
icon_state = "skull_unathi"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/skrell
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to a skrell."
|
||||
icon_state = "skull"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/vasilissan
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vasilissan."
|
||||
icon_state = "skull"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/akula
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to an akula."
|
||||
icon_state = "skull_unathi"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/rapala
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to a rapala."
|
||||
icon_state = "skull"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/vulpkanin
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vulpkanin."
|
||||
icon_state = "skull_taj"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/sergal
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to a sergal."
|
||||
icon_state = "skull_taj"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/zorren
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to a zorren."
|
||||
icon_state = "skull_taj"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/nevrean
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to a nevrean."
|
||||
icon_state = "skull_taj"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/teshari
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to a teshari."
|
||||
icon_state = "skull_taj"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/vox
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vox."
|
||||
icon_state = "skull_taj"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/unknown
|
||||
desc = "A bleached skull. It looks very weakened. You can't quite tell what species it belonged to."
|
||||
icon_state = "skull"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/unknown/anthro
|
||||
icon_state = "skull_taj"
|
||||
|
||||
/obj/item/weapon/digestion_remains/skull/xenohybrid
|
||||
desc = "A bleached skull. It looks very weakened. Seems like it belonged to something with an elongated head."
|
||||
icon_state = "skull_xenohybrid"
|
||||
@@ -1,7 +1,11 @@
|
||||
///////////////////// Mob Living /////////////////////
|
||||
/mob/living
|
||||
var/digestable = 1 // Can the mob be digested inside a belly?
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option - set var for leaving remains
|
||||
var/digest_leave_remains = 0 // Will this mob leave bones/skull/etc after the melty demise?
|
||||
var/allowmobvore = 1 // Will simplemobs attempt to eat the mob?
|
||||
//TFF 30/4/19: Ports VoreStation Mechanical Vore Prefs - set var for displaying vore prefs on examine
|
||||
var/showvoreprefs = 1 // Determines if the mechanical vore preferences button will be displayed on the mob or not.
|
||||
var/obj/belly/vore_selected // Default to no vore capability.
|
||||
var/list/vore_organs = list() // List of vore containers inside a mob
|
||||
var/absorbed = 0 // If a mob is absorbed into another
|
||||
@@ -194,6 +198,8 @@
|
||||
var/datum/vore_preferences/P = client.prefs_vr
|
||||
|
||||
P.digestable = src.digestable
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option
|
||||
P.digest_leave_remains = src.digest_leave_remains
|
||||
P.allowmobvore = src.allowmobvore
|
||||
P.vore_taste = src.vore_taste
|
||||
P.can_be_drop_prey = src.can_be_drop_prey
|
||||
@@ -219,6 +225,8 @@
|
||||
var/datum/vore_preferences/P = client.prefs_vr
|
||||
|
||||
digestable = P.digestable
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option
|
||||
P.digest_leave_remains = src.digest_leave_remains
|
||||
allowmobvore = P.allowmobvore
|
||||
vore_taste = P.vore_taste
|
||||
can_be_drop_prey = P.can_be_drop_prey
|
||||
@@ -612,3 +620,27 @@
|
||||
set category = "Preferences"
|
||||
set desc = "Switch sharp/fuzzy scaling for current mob."
|
||||
appearance_flags ^= PIXEL_SCALE
|
||||
|
||||
//TFF 30/4/19: Ports VoreStation Mechanical Vore Prefs & Remains-leaving in 1 go
|
||||
/mob/living/examine(mob/user)
|
||||
. = ..()
|
||||
if(showvoreprefs)
|
||||
to_chat(user, "<span class='deptradio'><a href='?src=\ref[src];vore_prefs=1'>\[Mechanical Vore Preferences\]</a></span>")
|
||||
|
||||
/mob/living/Topic(href, href_list) //Can't find any instances of Topic() being overridden by /mob/living in polaris' base code, even though /mob/living/carbon/human's Topic() has a ..() call
|
||||
if(href_list["vore_prefs"])
|
||||
display_voreprefs(usr)
|
||||
return ..()
|
||||
|
||||
/mob/living/proc/display_voreprefs(mob/user) //Called by Topic() calls on instances of /mob/living (and subtypes) containing vore_prefs as an argument
|
||||
if(!user)
|
||||
CRASH("display_voreprefs() was called without an associated user.")
|
||||
var/dispvoreprefs = "<b>[src]'s vore preferences</b><br><br><br>"
|
||||
dispvoreprefs += "<b>Digestable:</b> [digestable ? "Enabled" : "Disabled"]<br>"
|
||||
dispvoreprefs += "<b>Leaves Remains:</b> [digest_leave_remains ? "Enabled" : "Disabled"]<br>"
|
||||
dispvoreprefs += "<b>Mob Vore:</b> [allowmobvore ? "Enabled" : "Disabled"]<br>"
|
||||
dispvoreprefs += "<b>Drop-nom prey:</b> [can_be_drop_prey ? "Enabled" : "Disabled"]<br>"
|
||||
dispvoreprefs += "<b>Drop-nom pred:</b> [can_be_drop_pred ? "Enabled" : "Disabled"]<br>"
|
||||
user << browse("<html><head><title>Vore prefs: [src]</title></head><body><center>[dispvoreprefs]</center></body></html>", "window=[name];size=200x300;can_resize=0;can_minimize=0")
|
||||
onclose(user, "[name]")
|
||||
return
|
||||
|
||||
@@ -42,6 +42,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
/datum/vore_preferences
|
||||
//Actual preferences
|
||||
var/digestable = TRUE
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option - set boolean for leaving remains
|
||||
var/digest_leave_remains = FALSE
|
||||
var/allowmobvore = TRUE
|
||||
var/list/belly_prefs = list()
|
||||
var/vore_taste = "nothing in particular"
|
||||
@@ -92,9 +94,9 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
return 0 //Need to know what character to load!
|
||||
|
||||
slot = client.prefs.default_slot
|
||||
|
||||
|
||||
load_path(client_ckey,slot)
|
||||
|
||||
|
||||
if(!path) return 0 //Path couldn't be set?
|
||||
if(!fexists(path)) //Never saved before
|
||||
save_vore() //Make the file first
|
||||
@@ -108,6 +110,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
json_from_file = patch_version(json_from_file,version)
|
||||
|
||||
digestable = json_from_file["digestable"]
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option - add json stuff for whether a char's player allows said char to leave bones behind
|
||||
digest_leave_remains = json_from_file["digest_leave_remains"]
|
||||
allowmobvore = json_from_file["allowmobvore"]
|
||||
vore_taste = json_from_file["vore_taste"]
|
||||
can_be_drop_prey = json_from_file["can_be_drop_prey"]
|
||||
@@ -117,6 +121,9 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
//Quick sanitize
|
||||
if(isnull(digestable))
|
||||
digestable = TRUE
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option - sanitise for setting to false if left null
|
||||
if(isnull(digest_leave_remains))
|
||||
digest_leave_remains = FALSE
|
||||
if(isnull(allowmobvore))
|
||||
allowmobvore = TRUE
|
||||
if(isnull(can_be_drop_prey))
|
||||
@@ -130,11 +137,13 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
|
||||
/datum/vore_preferences/proc/save_vore()
|
||||
if(!path) return 0
|
||||
|
||||
|
||||
var/version = 1 //For "good times" use in the future
|
||||
var/list/settings_list = list(
|
||||
"version" = version,
|
||||
"digestable" = digestable,
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option - add toggleable setting to the list on Vore Panel
|
||||
"digest_leave_remains" = digest_leave_remains,
|
||||
"allowmobvore" = allowmobvore,
|
||||
"vore_taste" = vore_taste,
|
||||
"can_be_drop_prey" = can_be_drop_prey,
|
||||
@@ -147,7 +156,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
if(!json_to_file)
|
||||
log_debug("Saving: [path] failed jsonencode")
|
||||
return 0
|
||||
|
||||
|
||||
//Write it out
|
||||
if(fexists(path))
|
||||
fdel(path) //Byond only supports APPENDING to files, not replacing.
|
||||
|
||||
@@ -285,6 +285,13 @@
|
||||
if(0)
|
||||
dat += "<a href='?src=\ref[src];toggledg=1'><span style='color:green;'>Toggle Digestable</span></a>"
|
||||
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option - add option to leave remains after you digest a meal
|
||||
switch(user.digest_leave_remains)
|
||||
if(1)
|
||||
dat += "<a href='?src=\ref[src];toggledlm=1'><span style='color:red;'>Toggle Leaving Remains</span></a>"
|
||||
if(0)
|
||||
dat += "<a href='?src=\ref[src];toggledlm=1'>Toggle Leaving Remains</a>"
|
||||
|
||||
switch(user.allowmobvore)
|
||||
if(1)
|
||||
dat += "<a href='?src=\ref[src];togglemv=1'>Toggle Mob Vore</a>"
|
||||
@@ -742,20 +749,21 @@
|
||||
selected = user.vore_organs[1]
|
||||
user.vore_selected = user.vore_organs[1]
|
||||
|
||||
//TFF 30/4/19: We're not Virgo here, change to the right server name
|
||||
if(href_list["saveprefs"])
|
||||
if(!user.save_vore_prefs())
|
||||
alert("ERROR: Virgo-specific preferences failed to save!","Error")
|
||||
alert("ERROR: ChompStation-specific preferences failed to save!","Error")
|
||||
else
|
||||
to_chat(user,"<span class='notice'>Virgo-specific preferences saved!</span>")
|
||||
to_chat(user,"<span class='notice'>ChompStation-specific preferences saved!</span>")
|
||||
|
||||
if(href_list["applyprefs"])
|
||||
var/alert = alert("Are you sure you want to reload character slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel")
|
||||
if(!alert == "Reload")
|
||||
return 0
|
||||
if(!user.apply_vore_prefs())
|
||||
alert("ERROR: Virgo-specific preferences failed to apply!","Error")
|
||||
alert("ERROR: ChompStation-specific preferences failed to apply!","Error")
|
||||
else
|
||||
to_chat(user,"<span class='notice'>Virgo-specific preferences applied from active slot!</span>")
|
||||
to_chat(user,"<span class='notice'>ChompStation-specific preferences applied from active slot!</span>")
|
||||
|
||||
if(href_list["setflavor"])
|
||||
var/new_flavor = html_encode(input(usr,"What your character tastes like (40ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",user.vore_taste) as text|null)
|
||||
@@ -803,6 +811,20 @@
|
||||
if(user.client.prefs_vr)
|
||||
user.client.prefs_vr.digestable = user.digestable
|
||||
|
||||
//TFF 30/4/19: Ports VoreStation Remains Option - add option that goes paw in paw with belly setting; allow yourself to leave bones behind after you're digested
|
||||
if(href_list["toggledlm"])
|
||||
var/choice = alert(user, "This button allows preds to have your remains be left in their belly after you are digested. This will only happen if pred sets their belly to do so. Remains consist of skeletal parts. Currently you are [user.digest_leave_remains? "" : "not"] leaving remains.", "", "Allow Post-digestion Remains", "Cancel", "Disallow Post-digestion Remains")
|
||||
switch(choice)
|
||||
if("Cancel")
|
||||
return 0
|
||||
if("Allow Post-digestion Remains")
|
||||
user.digest_leave_remains = TRUE
|
||||
if("Disallow Post-digestion Remains")
|
||||
user.digest_leave_remains = FALSE
|
||||
|
||||
if(user.client.prefs_vr)
|
||||
user.client.prefs_vr.digest_leave_remains = user.digest_leave_remains
|
||||
|
||||
if(href_list["togglemv"])
|
||||
var/choice = alert(user, "This button is for those who don't like being eaten by mobs. Messages admins when changed, so don't try to use it for mechanical benefit. Set it once and save it. Mobs are currently: [user.allowmobvore ? "Allowed to eat" : "Prevented from eating"] you.", "", "Allow Mob Predation", "Cancel", "Prevent Mob Predation")
|
||||
switch(choice)
|
||||
|
||||
@@ -1806,4 +1806,66 @@ Departamental Swimsuits, for general use
|
||||
icon_state = "zao_cap"
|
||||
|
||||
icon_override = 'icons/vore/custom_clothes_vr.dmi'
|
||||
item_state = "zao_cap_mob"
|
||||
item_state = "zao_cap_mob"
|
||||
|
||||
|
||||
/obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless/black
|
||||
name = "black denim vest"
|
||||
desc = "A black denim vest."
|
||||
icon_state = "blk_jacket"
|
||||
icon_override = "icons/mob/suit_vr.dmi"
|
||||
icon = 'icons/mob/suit_vr.dmi'
|
||||
|
||||
/obj/item/clothing/glasses/goggles/flip
|
||||
name = "goggles"
|
||||
icon_override = "icons/mob/eyes_vr.dmi"
|
||||
icon = 'icons/mob/eyes_vr.dmi'
|
||||
desc = "Just some plain old goggles."
|
||||
icon_state = "Goggles-g"
|
||||
item_state_slots = list(slot_r_hand_str = "glasses", slot_l_hand_str = "glasses")
|
||||
item_flags = AIRTIGHT
|
||||
body_parts_covered = EYES
|
||||
action_button_name = "Flip Goggles"
|
||||
var/up = 0
|
||||
|
||||
sprite_sheets = list(
|
||||
"Teshari" = 'icons/mob/species/seromi/eyes_vr.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/shoes/boots/jackboots/tall
|
||||
name = "tall jackboots"
|
||||
desc = "Modified pair of jackboots, made to be taller by some fashion designer."
|
||||
icon_state = "tallboots"
|
||||
icon_override = 'icons/mob/feet_vr.dmi'
|
||||
icon = 'icons/mob/feet_vr.dmi'
|
||||
item_state_slots = list(slot_r_hand_str = "tallboots", slot_l_hand_str = "jackboots")
|
||||
species_restricted = null
|
||||
|
||||
|
||||
/obj/item/clothing/glasses/goggles/flip/attack_self()
|
||||
toggle()
|
||||
|
||||
/obj/item/clothing/glasses/goggles/flip/verb/toggle()
|
||||
set category = "Object"
|
||||
set name = "Adjust goggles"
|
||||
set src in usr
|
||||
|
||||
if(usr.canmove && !usr.stat && !usr.restrained())
|
||||
if(src.up)
|
||||
src.up = !src.up
|
||||
flags_inv |= HIDEEYES
|
||||
body_parts_covered |= EYES
|
||||
icon_state = initial(icon_state)
|
||||
flash_protection = initial(flash_protection)
|
||||
tint = initial(tint)
|
||||
to_chat(usr, "You flip \the [src] down to protect your eyes.")
|
||||
else
|
||||
src.up = !src.up
|
||||
flags_inv &= ~HIDEEYES
|
||||
body_parts_covered &= ~EYES
|
||||
icon_state = "[initial(icon_state)]up"
|
||||
flash_protection = FLASH_PROTECTION_NONE
|
||||
tint = TINT_NONE
|
||||
to_chat(usr, "You push \the [src] up out of your face.")
|
||||
update_clothing_icon()
|
||||
usr.update_action_buttons()
|
||||
@@ -615,6 +615,93 @@
|
||||
taurtype = /datum/sprite_accessory/tail/taur/feline/tempest
|
||||
no_message = "These saddlebags seem to be fitted for someone else, and keep slipping off!"
|
||||
|
||||
//TFF 29/4/19: Add standardised reagent generators for loadout
|
||||
/obj/item/weapon/implant/reagent_generator/milk
|
||||
name = "milk generation implant"
|
||||
desc = "It's an implant you can use to make milk from yourself!"
|
||||
generated_reagents = list("milk" = 2)
|
||||
reagent_name = "milk"
|
||||
usable_volume = 1000
|
||||
|
||||
empty_message = list("Your breasts are almost completely drained!")
|
||||
full_message = list("Your teats feel heavy and swollen!")
|
||||
emote_descriptor = list("squeezes milk", "tugs on their breasts, milking them")
|
||||
self_emote_descriptor = list("squeeze")
|
||||
random_emote = list("moos quietly")
|
||||
verb_name = "Milk"
|
||||
verb_desc = "Grab their nipples and milk them into a container! May cause blushing and groaning."
|
||||
|
||||
/obj/item/weapon/implanter/reagent_generator/milk
|
||||
implant_type = /obj/item/weapon/implant/reagent_generator/milk
|
||||
|
||||
/obj/item/weapon/implant/reagent_generator/egg
|
||||
name = "egg laying implant"
|
||||
desc = "This is an implant that allows the user to lay eggs."
|
||||
generated_reagents = list("egg" = 2)
|
||||
usable_volume = 500
|
||||
transfer_amount = 50
|
||||
|
||||
empty_message = list("Your lower belly feels smooth and empty. Sorry, we're out of eggs!", "The reduced pressure in your lower belly tells you there are no more eggs.")
|
||||
full_message = list("Your lower belly looks swollen with irregular bumps, and it feels heavy.", "Your lower abdomen feels really heavy, making it a bit hard to walk.")
|
||||
emote_descriptor = list("an egg right out of their belly!", "into their belly firmly, forcing them to lay an egg!", "them really tight, making them lay an egg promptly!")
|
||||
var/verb_descriptor = list("squeezes", "pushes", "hugs")
|
||||
var/self_verb_descriptor = list("squeeze", "push", "hug")
|
||||
var/short_emote_descriptor = list("lays", "forces out", "pushes out")
|
||||
self_emote_descriptor = list("lay", "force out", "push out")
|
||||
random_emote = list("moans softly with a blush on their face", "yelps in embarrassment", "grunts a little")
|
||||
assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_egg
|
||||
|
||||
/obj/item/weapon/implant/reagent_generator/egg/implanted(mob/living/carbon/source)
|
||||
processing_objects += src
|
||||
to_chat(source, "<span class='notice'>You implant [source] with \the [src].</span>")
|
||||
source.verbs |= assigned_proc
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/implanter/reagent_generator/egg
|
||||
implant_type = /obj/item/weapon/implant/reagent_generator/egg
|
||||
|
||||
/mob/living/carbon/human/proc/use_reagent_implant_egg()
|
||||
set name = "Lay Egg"
|
||||
set desc = "Force them to lay an egg by squeezing into their lower body!"
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
//do_reagent_implant(usr)
|
||||
if(!isliving(usr) || !usr.canClick())
|
||||
return
|
||||
|
||||
if(usr.incapacitated() || usr.stat > CONSCIOUS)
|
||||
return
|
||||
|
||||
var/obj/item/weapon/implant/reagent_generator/egg/rimplant
|
||||
for(var/obj/item/organ/external/E in organs)
|
||||
for(var/obj/item/weapon/implant/I in E.implants)
|
||||
if(istype(I, /obj/item/weapon/implant/reagent_generator))
|
||||
rimplant = I
|
||||
break
|
||||
if (rimplant)
|
||||
if(rimplant.reagents.total_volume <= rimplant.transfer_amount)
|
||||
to_chat(src, "<span class='notice'>[pick(rimplant.empty_message)]</span>")
|
||||
return
|
||||
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/egg(get_turf(src))
|
||||
|
||||
var/index = rand(0,3)
|
||||
|
||||
if (usr != src)
|
||||
var/emote = rimplant.emote_descriptor[index]
|
||||
var/verb_desc = rimplant.verb_descriptor[index]
|
||||
var/self_verb_desc = rimplant.self_verb_descriptor[index]
|
||||
usr.visible_message("<span class='notice'>[usr] [verb_desc] [emote]</span>",
|
||||
"<span class='notice'>You [self_verb_desc] [emote]</span>")
|
||||
else
|
||||
visible_message("<span class='notice'>[src] [pick(rimplant.short_emote_descriptor)] an egg.</span>",
|
||||
"<span class='notice'>You [pick(rimplant.self_emote_descriptor)] an egg.</span>")
|
||||
if(prob(15))
|
||||
visible_message("<span class='notice'>[src] [pick(rimplant.random_emote)].</span>") // M-mlem.
|
||||
|
||||
rimplant.reagents.remove_any(rimplant.transfer_amount)
|
||||
|
||||
//WickedTempest: Chakat Tempest
|
||||
/obj/item/weapon/implant/reagent_generator/tempest
|
||||
generated_reagents = list("milk" = 2)
|
||||
|
||||
|
After Width: | Height: | Size: 715 B |
|
Before Width: | Height: | Size: 740 B After Width: | Height: | Size: 805 B |
|
After Width: | Height: | Size: 716 B |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 700 B |
@@ -1486,6 +1486,7 @@
|
||||
#include "code\modules\client\preference_setup\loadout\loadout_gloves_vr.dm"
|
||||
#include "code\modules\client\preference_setup\loadout\loadout_head.dm"
|
||||
#include "code\modules\client\preference_setup\loadout\loadout_head_vr.dm"
|
||||
#include "code\modules\client\preference_setup\loadout\loadout_implants.dm"
|
||||
#include "code\modules\client\preference_setup\loadout\loadout_mask.dm"
|
||||
#include "code\modules\client\preference_setup\loadout\loadout_shoes.dm"
|
||||
#include "code\modules\client\preference_setup\loadout\loadout_shoes_vr.dm"
|
||||
@@ -2801,6 +2802,7 @@
|
||||
#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"
|
||||
#include "code\modules\vore\eating\leave_remains_vr.dm"
|
||||
#include "code\modules\vore\eating\living_vr.dm"
|
||||
#include "code\modules\vore\eating\silicon_vr.dm"
|
||||
#include "code\modules\vore\eating\simple_animal_vr.dm"
|
||||
|
||||