mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-07-15 17:12:49 +01:00
Merge branch 'master' into smvf
This commit is contained in:
@@ -29,7 +29,7 @@
|
||||
return
|
||||
if (ishuman(user) && src.loc == user)
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(src != H.l_store && src != H.r_store && src != H.s_store)
|
||||
if(src == H.w_uniform) // VOREStation Edit - Un-equip on single click, but not on uniform.
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -209,7 +209,7 @@ var/list/slot_equipment_priority = list( \
|
||||
if(target)
|
||||
I.forceMove(target)
|
||||
else
|
||||
I.dropInto(loc)
|
||||
I.dropInto(drop_location())
|
||||
I.dropped(src)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
|
||||
for(var/obj/item/organ/external/EO in organs)
|
||||
if(EO.brute_dam || EO.burn_dam)
|
||||
output += "[EO.name] - <span class='warning'>[EO.burn_dam + EO.brute_dam > ROBOLIMB_REPAIR_CAP ? "Heavy Damage" : "Light Damage"]</span>\n"
|
||||
output += "[EO.name] - <span class='warning'>[EO.burn_dam + EO.brute_dam > EO.min_broken_damage ? "Heavy Damage" : "Light Damage"]</span>\n" //VOREStation Edit - Makes robotic limb damage scalable
|
||||
else
|
||||
output += "[EO.name] - <span style='color:green;'>OK</span>\n"
|
||||
|
||||
|
||||
@@ -96,6 +96,17 @@
|
||||
cost = -1
|
||||
var_changes = list("flash_mod" = 2.0)
|
||||
|
||||
/datum/trait/hollow
|
||||
name = "Hollow Bones/Aluminum Alloy"
|
||||
desc = "Your bones and robot limbs are much easier to break."
|
||||
cost = -2 //I feel like this should be higher, but let's see where it goes
|
||||
|
||||
/datum/trait/hollow/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
for(var/obj/item/organ/external/O in H.organs)
|
||||
O.min_broken_damage *= 0.5
|
||||
O.min_bruised_damage *= 0.5
|
||||
|
||||
/datum/trait/lightweight
|
||||
name = "Lightweight"
|
||||
desc = "Your light weight and poor balance make you very susceptible to unhelpful bumping. Think of it like a bowling ball versus a pin."
|
||||
|
||||
@@ -456,9 +456,10 @@
|
||||
/hook/death/proc/nif_soulcatcher(var/mob/living/carbon/human/H)
|
||||
if(!istype(H) || !H.mind) return TRUE //Hooks must return TRUE
|
||||
|
||||
if(ishuman(H.loc)) //Died in someone
|
||||
var/mob/living/carbon/human/HP = H.loc
|
||||
if(HP.nif && HP.nif.flag_check(NIF_O_SCOTHERS,NIF_FLAGS_OTHER))
|
||||
if(isbelly(H.loc)) //Died in someone
|
||||
var/obj/belly/B = H.loc
|
||||
var/mob/living/carbon/human/HP = B.owner
|
||||
if(istype(HP) && HP.nif && HP.nif.flag_check(NIF_O_SCOTHERS,NIF_FLAGS_OTHER))
|
||||
var/datum/nifsoft/soulcatcher/SC = HP.nif.imp_check(NIF_SOULCATCHER)
|
||||
SC.catch_mob(H)
|
||||
else if(H.nif && H.nif.flag_check(NIF_O_SCMYSELF,NIF_FLAGS_OTHER)) //They are caught in their own NIF
|
||||
|
||||
@@ -148,25 +148,25 @@ var/list/organ_cache = list()
|
||||
germ_level = 0
|
||||
return 0
|
||||
|
||||
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
|
||||
var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC] || 0
|
||||
|
||||
var/infection_damage = 0
|
||||
|
||||
if((status & ORGAN_DEAD) && antibiotics < 30) //Sepsis from 'dead' organs
|
||||
if((status & ORGAN_DEAD) && antibiotics < ANTIBIO_OD) //Sepsis from 'dead' organs
|
||||
infection_damage = min(1, 1 + round((germ_level - INFECTION_LEVEL_THREE)/200,0.25)) //1 Tox plus a little based on germ level
|
||||
|
||||
else if(germ_level > INFECTION_LEVEL_TWO && antibiotics < 30)
|
||||
else if(germ_level > INFECTION_LEVEL_TWO && antibiotics < ANTIBIO_OD)
|
||||
infection_damage = min(0.25, 0.25 + round((germ_level - INFECTION_LEVEL_TWO)/200,0.25))
|
||||
|
||||
if(infection_damage)
|
||||
owner.adjustToxLoss(infection_damage)
|
||||
|
||||
if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30))
|
||||
adjust_germ_level(-1)
|
||||
adjust_germ_level(-antibiotics)
|
||||
|
||||
if (germ_level >= INFECTION_LEVEL_ONE/2)
|
||||
//aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes
|
||||
if(antibiotics < 5 && prob(round(germ_level/6)))
|
||||
if(!antibiotics && prob(round(germ_level/6)))
|
||||
adjust_germ_level(1)
|
||||
|
||||
if(germ_level >= INFECTION_LEVEL_ONE)
|
||||
@@ -181,7 +181,7 @@ var/list/organ_cache = list()
|
||||
. = 2 //Organ qualifies for effect-specific processing
|
||||
//No particular effect on the general 'organ' at 3
|
||||
|
||||
if (germ_level >= INFECTION_LEVEL_THREE && antibiotics < 30)
|
||||
if (germ_level >= INFECTION_LEVEL_THREE && antibiotics < ANTIBIO_OD)
|
||||
. = 3 //Organ qualifies for effect-specific processing
|
||||
adjust_germ_level(rand(5,10)) //Germ_level increases without overdose of antibiotics
|
||||
|
||||
@@ -234,19 +234,19 @@ var/list/organ_cache = list()
|
||||
|
||||
//Germs
|
||||
/obj/item/organ/proc/handle_antibiotics()
|
||||
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
|
||||
var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC] || 0
|
||||
|
||||
if (!germ_level || antibiotics < 5)
|
||||
if (!germ_level || antibiotics < ANTIBIO_NORM)
|
||||
return
|
||||
|
||||
if (germ_level < INFECTION_LEVEL_ONE)
|
||||
germ_level = 0 //cure instantly
|
||||
else if (germ_level < INFECTION_LEVEL_TWO)
|
||||
adjust_germ_level(-6) //at germ_level < 500, this should cure the infection in a minute
|
||||
adjust_germ_level(-antibiotics*4) //at germ_level < 500, this should cure the infection in a minute
|
||||
else if (germ_level < INFECTION_LEVEL_THREE)
|
||||
adjust_germ_level(-2) //at germ_level < 1000, this will cure the infection in 5 minutes
|
||||
adjust_germ_level(-antibiotics*2) //at germ_level < 1000, this will cure the infection in 5 minutes
|
||||
else
|
||||
adjust_germ_level(-1) // You waited this long to get treated, you don't really deserve this organ
|
||||
adjust_germ_level(-antibiotics) // You waited this long to get treated, you don't really deserve this organ
|
||||
|
||||
//Adds autopsy data for used_weapon.
|
||||
/obj/item/organ/proc/add_autopsy_data(var/used_weapon, var/damage)
|
||||
|
||||
@@ -400,7 +400,7 @@
|
||||
user << "<span class='notice'>Nothing to fix!</span>"
|
||||
return 0
|
||||
|
||||
if(damage_amount >= ROBOLIMB_REPAIR_CAP)
|
||||
if(damage_amount >= min_broken_damage) //VOREStation Edit - Makes robotic limb damage scalable
|
||||
user << "<span class='danger'>The damage is far too severe to patch over externally.</span>"
|
||||
return 0
|
||||
|
||||
@@ -1085,6 +1085,7 @@ Note that amputating the affected organ does in fact remove the infection from t
|
||||
|
||||
dislocated = -1
|
||||
cannot_break = 1
|
||||
min_broken_damage = ROBOLIMB_REPAIR_CAP //VOREStation Addition - Makes robotic limb damage scalable
|
||||
remove_splint()
|
||||
get_icon()
|
||||
unmutate()
|
||||
@@ -1133,7 +1134,7 @@ Note that amputating the affected organ does in fact remove the infection from t
|
||||
return !(status & (ORGAN_MUTATED|ORGAN_DEAD))
|
||||
|
||||
/obj/item/organ/external/proc/is_malfunctioning()
|
||||
return ((robotic >= ORGAN_ROBOT) && (brute_dam + burn_dam) >= 25 && prob(brute_dam + burn_dam))
|
||||
return ((robotic >= ORGAN_ROBOT) && (brute_dam + burn_dam) >= min_broken_damage*0.83 && prob(brute_dam + burn_dam)) //VOREStation Edit - Makes robotic limb damage scalable
|
||||
|
||||
/obj/item/organ/external/proc/embed(var/obj/item/weapon/W, var/silent = 0)
|
||||
if(!owner || loc != owner)
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
/datum/reagent/proc/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
return
|
||||
|
||||
/datum/reagent/proc/overdose(var/mob/living/carbon/M, var/alien, var/removed) // Overdose effect. Doesn't happen instantly.
|
||||
/datum/reagent/proc/overdose(var/mob/living/carbon/M, var/alien, var/removed) // Overdose effect.
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
if(ishuman(M))
|
||||
|
||||
@@ -509,11 +509,46 @@
|
||||
taste_description = "bitterness"
|
||||
reagent_state = LIQUID
|
||||
color = "#C1C1C1"
|
||||
metabolism = REM * 0.05
|
||||
metabolism = REM * 0.25
|
||||
mrate_static = TRUE
|
||||
overdose = REAGENTS_OVERDOSE
|
||||
scannable = 1
|
||||
|
||||
/datum/reagent/spaceacillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
M.add_chemical_effect(CE_ANTIBIOTIC, dose >= overdose ? ANTIBIO_OD : ANTIBIO_NORM)
|
||||
|
||||
/datum/reagent/corophizine
|
||||
name = "Corophizine"
|
||||
id = "corophizine"
|
||||
description = "A wide-spectrum antibiotic drug. Powerful and uncomfortable in equal doses."
|
||||
taste_description = "burnt toast"
|
||||
reagent_state = LIQUID
|
||||
color = "#FFB0B0"
|
||||
mrate_static = TRUE
|
||||
overdose = 10
|
||||
scannable = 1
|
||||
|
||||
/datum/reagent/corophizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
M.add_chemical_effect(CE_ANTIBIOTIC, ANTIBIO_SUPER)
|
||||
|
||||
//Based roughly on Levofloxacin's rather severe side-effects
|
||||
if(prob(20))
|
||||
M.Confuse(5)
|
||||
if(prob(20))
|
||||
M.Weaken(5)
|
||||
if(prob(20))
|
||||
M.make_dizzy(5)
|
||||
if(prob(20))
|
||||
M.hallucination = max(M.hallucination, 10)
|
||||
|
||||
//One of the levofloxacin side effects is 'spontaneous tendon rupture', which I'll immitate here. 1:1000 chance, so, pretty darn rare.
|
||||
if(ishuman(M) && rand(1,1000) == 1)
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/external/eo = pick(H.organs) //Misleading variable name, 'organs' is only external organs
|
||||
eo.fracture()
|
||||
|
||||
/datum/reagent/sterilizine
|
||||
name = "Sterilizine"
|
||||
id = "sterilizine"
|
||||
|
||||
@@ -417,6 +417,14 @@
|
||||
required_reagents = list("cryptobiolin" = 1, "inaprovaline" = 1)
|
||||
result_amount = 2
|
||||
|
||||
/datum/chemical_reaction/corophizine
|
||||
name = "Corophizine"
|
||||
id = "corophizine"
|
||||
result = "corophizine"
|
||||
required_reagents = list("spaceacillin" = 1, "carbon" = 1, "phoron" = 0.1)
|
||||
catalysts = list("phoron" = 5)
|
||||
result_amount = 2
|
||||
|
||||
/datum/chemical_reaction/imidazoline
|
||||
name = "imidazoline"
|
||||
id = "imidazoline"
|
||||
|
||||
@@ -201,13 +201,13 @@
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/ears/otie
|
||||
name = "otie, colorable"
|
||||
/datum/sprite_accessory/ears/antlers_e
|
||||
name = "antlers with ears"
|
||||
desc = ""
|
||||
icon_state = "otie"
|
||||
icon_state = "cow-nohorns"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "otie-inner"
|
||||
extra_overlay = "antlers_mark"
|
||||
|
||||
/datum/sprite_accessory/ears/cow
|
||||
name = "cow, horns"
|
||||
@@ -221,6 +221,21 @@
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/ears/cow_nohorns
|
||||
name = "cow, no horns"
|
||||
desc = ""
|
||||
icon_state = "cow-nohorns"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/ears/otie
|
||||
name = "otie, colorable"
|
||||
desc = ""
|
||||
icon_state = "otie"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "otie-inner"
|
||||
|
||||
/datum/sprite_accessory/ears/zears
|
||||
name = "jagged ears"
|
||||
desc = ""
|
||||
@@ -823,6 +838,14 @@
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/tail/newtailmaw
|
||||
name = "new tailmaw (vwag)"
|
||||
desc = ""
|
||||
icon_state = "newtailmaw"
|
||||
ani_state = "newtailmaw_w"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/tail/ztail
|
||||
name = "jagged flufftail"
|
||||
desc = ""
|
||||
@@ -845,6 +868,22 @@
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "sergal_mark"
|
||||
|
||||
/datum/sprite_accessory/tail/skunktail
|
||||
name = "skunk, dual-color"
|
||||
desc = ""
|
||||
icon_state = "skunktail"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "skunktail_mark"
|
||||
|
||||
/datum/sprite_accessory/tail/deertail
|
||||
name = "deer, dual-color"
|
||||
desc = ""
|
||||
icon_state = "deertail"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "deertail_mark"
|
||||
|
||||
//For all species tails. Includes haircolored tails.
|
||||
/datum/sprite_accessory/tail/special
|
||||
name = "Blank tail. Do not select."
|
||||
|
||||
@@ -172,45 +172,54 @@
|
||||
// Release all contents of this belly into the owning mob's location.
|
||||
// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in.
|
||||
// Returns the number of mobs so released.
|
||||
/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE)
|
||||
/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE, var/silent = FALSE)
|
||||
|
||||
//Don't bother if we don't have contents
|
||||
if(!contents.len)
|
||||
return 0
|
||||
var/atom/destination = drop_location()
|
||||
|
||||
//Find where we should drop things into (certainly not the owner)
|
||||
var/count = 0
|
||||
|
||||
//Iterate over contents and move them all
|
||||
for(var/thing in contents)
|
||||
var/atom/movable/AM = thing
|
||||
if(isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
if(L.absorbed && !include_absorbed)
|
||||
continue
|
||||
L.absorbed = FALSE
|
||||
|
||||
AM.forceMove(destination) // Move the belly contents into the same location as belly's owner.
|
||||
count++
|
||||
count += release_specific_contents(AM, silent = TRUE)
|
||||
|
||||
//Clean up our own business
|
||||
items_preserved.Cut()
|
||||
owner.visible_message("<font color='green'><b>[owner] expels everything from their [lowertext(name)]!</b></font>")
|
||||
owner.update_icons()
|
||||
if(release_sound)
|
||||
playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
|
||||
if(isanimal(owner))
|
||||
owner.update_icons()
|
||||
|
||||
//Print notifications/sound if necessary
|
||||
if(!silent)
|
||||
owner.visible_message("<font color='green'><b>[owner] expels everything from their [lowertext(name)]!</b></font>")
|
||||
if(release_sound)
|
||||
playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
|
||||
|
||||
return count
|
||||
|
||||
// Release a specific atom from the contents of this belly into the owning mob's location.
|
||||
// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in.
|
||||
// Returns the number of atoms so released.
|
||||
/obj/belly/proc/release_specific_contents(var/atom/movable/M)
|
||||
/obj/belly/proc/release_specific_contents(var/atom/movable/M, var/silent = FALSE)
|
||||
if (!(M in contents))
|
||||
return 0 // They weren't in this belly anyway
|
||||
|
||||
M.forceMove(drop_location()) // Move the belly contents into the same location as belly's owner.
|
||||
//Place them into our drop_location
|
||||
M.forceMove(drop_location())
|
||||
items_preserved -= M
|
||||
if(release_sound)
|
||||
playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
|
||||
|
||||
|
||||
//Special treatment for absorbed prey
|
||||
if(istype(M,/mob/living))
|
||||
var/mob/living/ML = M
|
||||
var/mob/living/OW = owner
|
||||
if(ML.absorbed)
|
||||
ML.absorbed = 0
|
||||
ML.absorbed = FALSE
|
||||
if(ishuman(M) && ishuman(OW))
|
||||
var/mob/living/carbon/human/Prey = M
|
||||
var/mob/living/carbon/human/Pred = OW
|
||||
@@ -220,8 +229,16 @@
|
||||
absorbed_count++
|
||||
Pred.bloodstr.trans_to(Prey, Pred.reagents.total_volume / absorbed_count)
|
||||
|
||||
owner.visible_message("<font color='green'><b>[owner] expels [M] from their [lowertext(name)]!</b></font>")
|
||||
owner.update_icons()
|
||||
//Clean up our own business
|
||||
if(isanimal(owner))
|
||||
owner.update_icons()
|
||||
|
||||
//Print notifications/sound if necessary
|
||||
if(!silent)
|
||||
owner.visible_message("<font color='green'><b>[owner] expels [M] from their [lowertext(name)]!</b></font>")
|
||||
if(release_sound)
|
||||
playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
|
||||
|
||||
return 1
|
||||
|
||||
// Actually perform the mechanics of devouring the tasty prey.
|
||||
@@ -329,13 +346,7 @@
|
||||
|
||||
// If digested prey is also a pred... anyone inside their bellies gets moved up.
|
||||
if(is_vore_predator(M))
|
||||
for(var/belly in M.vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
for(var/thing in B)
|
||||
var/atom/movable/AM = thing
|
||||
AM.forceMove(src)
|
||||
if(isliving(AM))
|
||||
to_chat(AM,"As [M] melts away around you, you find yourself in [owner]'s [lowertext(name)]")
|
||||
M.release_vore_contents(include_absorbed = TRUE, silent = TRUE)
|
||||
|
||||
//Drop all items into the belly.
|
||||
if(config.items_survive_digestion)
|
||||
@@ -350,7 +361,7 @@
|
||||
for(var/slot in slots)
|
||||
var/obj/item/thingy = M.get_equipped_item(slot = slot)
|
||||
if(thingy)
|
||||
M.remove_from_mob(thingy, M.drop_location())
|
||||
M.unEquip(thingy,force = TRUE)
|
||||
|
||||
//Reagent transfer
|
||||
if(ishuman(owner))
|
||||
@@ -419,13 +430,17 @@
|
||||
/obj/belly/drop_location()
|
||||
//Should be the case 99.99% of the time
|
||||
if(owner)
|
||||
return owner.loc
|
||||
return owner.drop_location()
|
||||
//Sketchy fallback for safety, put them somewhere safe.
|
||||
else
|
||||
log_debug("[src] (\ref[src]) doesn't have an owner, and dropped someone at a latespawn point!")
|
||||
var/fallback = pick(latejoin)
|
||||
return get_turf(fallback)
|
||||
|
||||
//Yes, it's ""safe"" to drop items here
|
||||
/obj/belly/AllowDrop()
|
||||
return TRUE
|
||||
|
||||
//Handle a mob struggling
|
||||
// Called from /mob/living/carbon/relaymove()
|
||||
/obj/belly/proc/relay_resist(var/mob/living/R)
|
||||
|
||||
@@ -120,18 +120,12 @@
|
||||
continue
|
||||
for(var/slot in slots)
|
||||
var/obj/item/thingy = M.get_equipped_item(slot = slot)
|
||||
if(thingy && M.canUnEquip(thingy))
|
||||
if(slot == slot_w_uniform)
|
||||
var/list/stash = list(slot_r_store,slot_l_store,slot_wear_id,slot_belt)
|
||||
for(var/stashslot in stash)
|
||||
var/obj/item/SL = M.get_equipped_item(stashslot)
|
||||
if(SL)
|
||||
M.remove_from_mob(SL, M.drop_location())
|
||||
M.remove_from_mob(thingy, M.drop_location())
|
||||
if(thingy)
|
||||
M.unEquip(thingy,force = TRUE)
|
||||
digest_item(thingy)
|
||||
break
|
||||
|
||||
M.updateVRPanel()
|
||||
|
||||
owner.updateVRPanel()
|
||||
|
||||
//////////////////////////// DM_ABSORB ////////////////////////////
|
||||
|
||||
@@ -222,10 +222,10 @@
|
||||
//
|
||||
// Release everything in every vore organ
|
||||
//
|
||||
/mob/living/proc/release_vore_contents(var/include_absorbed = TRUE)
|
||||
/mob/living/proc/release_vore_contents(var/include_absorbed = TRUE, var/silent = FALSE)
|
||||
for(var/belly in vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
B.release_all_contents(include_absorbed)
|
||||
B.release_all_contents(include_absorbed, silent)
|
||||
|
||||
//
|
||||
// Returns examine messages for bellies
|
||||
|
||||
Reference in New Issue
Block a user