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


" + dispvoreprefs += "Digestable: [digestable ? "Enabled" : "Disabled"]
" + dispvoreprefs += "Leaves Remains: [digest_leave_remains ? "Enabled" : "Disabled"]
" + dispvoreprefs += "Mob Vore: [allowmobvore ? "Enabled" : "Disabled"]
" + dispvoreprefs += "Drop-nom prey: [can_be_drop_prey ? "Enabled" : "Disabled"]
" + dispvoreprefs += "Drop-nom pred: [can_be_drop_pred ? "Enabled" : "Disabled"]
" + user << browse("Vore prefs: [src]
[dispvoreprefs]
", "window=[name];size=200x300;can_resize=0;can_minimize=0") + onclose(user, "[name]") + return diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index d6939e9c95..84c421c214 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -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. diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index f76cc11c59..5b7be77ea5 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -285,6 +285,13 @@ if(0) dat += "Toggle Digestable" + //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 += "Toggle Leaving Remains" + if(0) + dat += "Toggle Leaving Remains" + switch(user.allowmobvore) if(1) dat += "Toggle Mob Vore" @@ -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,"Virgo-specific preferences saved!") + to_chat(user,"ChompStation-specific preferences saved!") 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,"Virgo-specific preferences applied from active slot!") + to_chat(user,"ChompStation-specific preferences applied from active slot!") 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) diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index eceeed617a..fc37b581df 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -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" \ No newline at end of file + 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() \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 7221feb2cf..a3d2f6b724 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -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, "You implant [source] with \the [src].") + 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, "[pick(rimplant.empty_message)]") + 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("[usr] [verb_desc] [emote]", + "You [self_verb_desc] [emote]") + else + visible_message("[src] [pick(rimplant.short_emote_descriptor)] an egg.", + "You [pick(rimplant.self_emote_descriptor)] an egg.") + if(prob(15)) + visible_message("[src] [pick(rimplant.random_emote)].") // M-mlem. + + rimplant.reagents.remove_any(rimplant.transfer_amount) + //WickedTempest: Chakat Tempest /obj/item/weapon/implant/reagent_generator/tempest generated_reagents = list("milk" = 2) diff --git a/icons/mob/eyes_vr.dmi b/icons/mob/eyes_vr.dmi new file mode 100644 index 0000000000..ca5e9fb3ee Binary files /dev/null and b/icons/mob/eyes_vr.dmi differ diff --git a/icons/mob/feet_vr.dmi b/icons/mob/feet_vr.dmi index 41062144df..8b3c9e8ed8 100644 Binary files a/icons/mob/feet_vr.dmi and b/icons/mob/feet_vr.dmi differ diff --git a/icons/mob/species/seromi/eyes_vr.dmi b/icons/mob/species/seromi/eyes_vr.dmi new file mode 100644 index 0000000000..1addecdfd3 Binary files /dev/null and b/icons/mob/species/seromi/eyes_vr.dmi differ diff --git a/icons/mob/suit_vr.dmi b/icons/mob/suit_vr.dmi index da3c85c443..c8a89bd322 100644 Binary files a/icons/mob/suit_vr.dmi and b/icons/mob/suit_vr.dmi differ diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi index 9e9c0793cd..db916678c9 100644 Binary files a/icons/mob/vore/taurs_vr.dmi and b/icons/mob/vore/taurs_vr.dmi differ diff --git a/icons/obj/bones_vr.dmi b/icons/obj/bones_vr.dmi new file mode 100644 index 0000000000..ad384a6907 Binary files /dev/null and b/icons/obj/bones_vr.dmi differ diff --git a/vorestation.dme b/vorestation.dme index 685cc538ca..4ca4ab30f7 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -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"