Merge pull request #13 from CHOMPstation/master

A Dozen Syncs. Yay.
This commit is contained in:
TheFurryFeline
2019-05-02 13:10:19 -04:00
committed by GitHub
38 changed files with 585 additions and 60 deletions
+4 -3
View File
@@ -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
+7
View File
@@ -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"
+21
View File
@@ -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
+5
View File
@@ -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
+1 -1
View File
@@ -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
+10 -1
View File
@@ -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)"
+3 -4
View File
@@ -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))
+6 -3
View File
@@ -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()
+3 -1
View File
@@ -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"
+32
View File
@@ -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
+13 -4
View File
@@ -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.
+26 -4
View File
@@ -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)
Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 740 B

After

Width:  |  Height:  |  Size: 805 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 B

+2
View File
@@ -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"