whole lotta stuff
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
//GS13 Preferences
|
||||
/datum/preferences
|
||||
//Weight Gain Sources
|
||||
///Weight gain from food
|
||||
var/weight_gain_food = FALSE
|
||||
///Weight gain from chems
|
||||
var/weight_gain_chems = FALSE
|
||||
///Weight gain from items
|
||||
var/weight_gain_items = FALSE
|
||||
///Weight gain from weapons
|
||||
var/weight_gain_weapons = FALSE
|
||||
///Weight gain from magic
|
||||
var/weight_gain_magic = FALSE
|
||||
///Weight gain from viruses
|
||||
var/weight_gain_viruses = FALSE
|
||||
///Weight gain from nanites
|
||||
var/weight_gain_nanites = FALSE
|
||||
///Blueberry Inflation
|
||||
var/blueberry_inflation = FALSE
|
||||
///Extreme weight gain
|
||||
var/weight_gain_extreme = FALSE
|
||||
///Persistant fatness
|
||||
var/weight_gain_persistent = FALSE
|
||||
///Permanent weight gain
|
||||
var/weight_gain_permanent = FALSE
|
||||
/// At what weight will you start to get stuck in airlocks?
|
||||
var/stuckage = FALSE
|
||||
/// At what weight will you start to break chairs?
|
||||
var/chair_breakage = FALSE
|
||||
/// Are items that only affect those at high weights able to affect the player?
|
||||
var/fatness_vulnerable = FALSE
|
||||
/// Similar to fatness_vulnerable, but with more extreme effects such as transformation/hypno.
|
||||
var/extreme_fatness_vulnerable = FALSE
|
||||
|
||||
// Helplessness, a set of prefs that make things extra tough at higher weights. If set to FALSE, they won't do anything.
|
||||
///What fatness level disables movement?
|
||||
var/helplessness_no_movement = FALSE
|
||||
///What fatness level makes the user clumsy?
|
||||
var/helplessness_clumsy = FALSE
|
||||
///What fatness level makes the user nearsighted
|
||||
var/helplessness_nearsighted = FALSE
|
||||
///What fatness level makes the user's face unrecognizable.
|
||||
var/helplessness_hidden_face = FALSE
|
||||
///What fatness level makes the user unable to speak?
|
||||
var/helplessness_mute = FALSE
|
||||
|
||||
///What fatness level, makes the user unable to use their arms?
|
||||
var/helplessness_immobile_arms = FALSE
|
||||
///What fatness level prevents the user from wearing jumpsuits
|
||||
var/helplessness_clothing_jumpsuit = FALSE
|
||||
///What fatness level prevents the user from wearing non-jumpsuit clothing
|
||||
var/helplessness_clothing_misc = FALSE
|
||||
///What fatness level prevents the user from wearing anything on their back
|
||||
var/helplessness_clothing_back = FALSE
|
||||
///What fatness level prevents the user from being buckled to anything?
|
||||
var/helplessness_no_buckle = FALSE
|
||||
|
||||
///Does the person wish to be involved with non-con weight gain events?
|
||||
var/noncon_weight_gain = FALSE
|
||||
|
||||
//Does the person wish to be fed from bots?
|
||||
var/bot_feeding = FALSE
|
||||
|
||||
///What is the max weight that the person wishes to be? If set to FALSE, there will be no max weight
|
||||
var/max_weight = FALSE
|
||||
|
||||
/// Prompts the user to choose a weight and returns said weight.
|
||||
/datum/preferences/proc/chose_weight(input_text = "Choose a weight.", mob/user)
|
||||
var/chosen_weight = FALSE
|
||||
var/picked_weight_class = input(user,
|
||||
input_text,
|
||||
"Character Preference", "None") as null|anything in list(
|
||||
"None", "Fat", "Fatter", "Very Fat", "Obese", "Morbidly Obese", "Extremely Obese", "Barely Mobile", "Immobile", "Other")
|
||||
|
||||
switch(picked_weight_class)
|
||||
if("Fat")
|
||||
chosen_weight = FATNESS_LEVEL_FATTER
|
||||
if("Fatter")
|
||||
chosen_weight = FATNESS_LEVEL_VERYFAT
|
||||
if("Very Fat")
|
||||
chosen_weight = FATNESS_LEVEL_OBESE
|
||||
if("Obese")
|
||||
chosen_weight = FATNESS_LEVEL_MORBIDLY_OBESE
|
||||
if("Morbidly Obese")
|
||||
chosen_weight = FATNESS_LEVEL_EXTREMELY_OBESE
|
||||
if("Extremely Obese")
|
||||
chosen_weight = FATNESS_LEVEL_BARELYMOBILE
|
||||
if("Barely Mobile")
|
||||
chosen_weight = FATNESS_LEVEL_IMMOBILE
|
||||
if("Immobile")
|
||||
chosen_weight = FATNESS_LEVEL_BLOB
|
||||
|
||||
if(picked_weight_class != "Other")
|
||||
return chosen_weight
|
||||
|
||||
var/custom_fatness = input(user, "What fatness level (BFI) would you like to use?", "Character Preference") as null|num
|
||||
if(isnull(custom_fatness))
|
||||
custom_fatness = FALSE
|
||||
|
||||
return custom_fatness
|
||||
|
||||
@@ -0,0 +1,156 @@
|
||||
/obj/item/clothing/under/rank/chef/modular
|
||||
name = "cook's modular suit"
|
||||
desc = "A suit which is given only to the most <b>hardcore</b> cooks in space. Now adjusts to the match the wearer's size!"
|
||||
|
||||
var/mob/living/carbon/U
|
||||
|
||||
/obj/item/clothing/under/rank/chef/modular/equipped(mob/user, slot)
|
||||
..()
|
||||
U = user
|
||||
|
||||
/obj/item/clothing/under/rank/chef/modular/dropped()
|
||||
..()
|
||||
U = null
|
||||
|
||||
/obj/item/clothing/under/rank/chef/modular/jumpsuit_adjust()
|
||||
..()
|
||||
worn_overlays()
|
||||
|
||||
/obj/item/clothing/under/rank/chef/modular/worn_overlays(isinhands = FALSE)
|
||||
if(!isinhands)
|
||||
. = list()
|
||||
var/obj/item/organ/O
|
||||
var/obj/item/organ/genital/G
|
||||
for(O in U.internal_organs)
|
||||
if(istype(O, /obj/item/organ/genital/belly))
|
||||
G = O
|
||||
if(!adjusted)
|
||||
if(G.size <= 9) //These need to be removed later, better to cap organ sizes to begin with
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_[G.size]", GENITALS_UNDER_LAYER)
|
||||
else
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_9", GENITALS_UNDER_LAYER)
|
||||
else
|
||||
if(G.size <= 9)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_[G.size]_d", GENITALS_UNDER_LAYER)
|
||||
else
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_9_d", GENITALS_UNDER_LAYER)
|
||||
if(istype(O, /obj/item/organ/genital/anus))
|
||||
G = O
|
||||
if(suit_style == DIGITIGRADE_SUIT_STYLE)
|
||||
if(G.size <= 10)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]_l", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]_l_NORTH", GENITALS_FRONT_LAYER)
|
||||
else
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_10_l", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_10_l_NORTH", GENITALS_FRONT_LAYER)
|
||||
else
|
||||
if(G.size <= 10)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]_NORTH", GENITALS_FRONT_LAYER)
|
||||
else
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_10", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_10_NORTH", GENITALS_FRONT_LAYER)
|
||||
if(istype(O, /obj/item/organ/genital/breasts))
|
||||
G = O
|
||||
if(G.size <= "impossible")
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "breasts_[G.size]", GENITALS_BEHIND_LAYER) //nearest
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "breasts_[G.size]_NORTH", BODY_FRONT_LAYER) //farthest
|
||||
else
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "breasts_impossible", GENITALS_BEHIND_LAYER) //nearest
|
||||
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "breasts_impossible_NORTH", BODY_FRONT_LAYER) //farthest
|
||||
if(damaged_clothes)
|
||||
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
|
||||
if(blood_DNA)
|
||||
. += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color())
|
||||
if(accessory_overlay)
|
||||
. += accessory_overlay
|
||||
|
||||
/obj/item/clothing/under/color/grey/modular
|
||||
name = "grey modular jumpsuit" //change name from base clothes to distinguish them
|
||||
desc = "A tasteful grey jumpsuit that reminds you of the good old days. Now adjusts to the match the wearer's size!" //description same as above
|
||||
|
||||
var/icon_location = 'GainStation13/icons/mob/modclothes/graymodular.dmi' //specify the file path where the modular overlays for those clothes are located
|
||||
var/mob/living/carbon/U //instance a variable for keeping track of the user
|
||||
|
||||
/obj/item/clothing/under/color/grey/modular/equipped(mob/user, slot) //whenever the clothes are in someone's inventory the clothes keep track of who that user is
|
||||
..()
|
||||
U = user
|
||||
|
||||
/obj/item/clothing/under/color/grey/modular/dropped() //whenever the clothes leave a person's inventory, they forget who held them
|
||||
..()
|
||||
U = null
|
||||
|
||||
/obj/item/clothing/under/color/grey/modular/jumpsuit_adjust() //when the user adjusts the clothes' style, rebuild the overlays
|
||||
..()
|
||||
worn_overlays()
|
||||
|
||||
/obj/item/clothing/under/color/grey/modular/worn_overlays(isinhands = FALSE)
|
||||
if(U)
|
||||
if(!isinhands) //make sure the clothes are being worn and aren't in someone's hands
|
||||
. = list()
|
||||
var/obj/item/organ/O
|
||||
var/obj/item/organ/genital/G
|
||||
for(O in U.internal_organs) //check the user for the organs they have
|
||||
if(istype(O, /obj/item/organ/genital/belly)) //if that organ is a belly
|
||||
G = O //treat that organ as a genital
|
||||
if(!adjusted) //check the style, if it needs to be the adjusted variants
|
||||
if(G.size <= 9) //check that the size is within accepted values, NOTE: these need to be removed later, better to cap organ sizes to begin with
|
||||
. += mutable_appearance(icon_location, "belly_[G.size]", GENITALS_UNDER_LAYER) //add, from the clothes' icon file the overlay corresponding to that genital at that size and draw it onto the layer
|
||||
else //if not an expected size value, bigger than the max, default to max size
|
||||
. += mutable_appearance(icon_location, "belly_9", GENITALS_UNDER_LAYER)
|
||||
else //use the alternative adjusted sprites
|
||||
if(G.size <= 9)
|
||||
. += mutable_appearance(icon_location, "belly_[G.size]_d", GENITALS_UNDER_LAYER)
|
||||
else
|
||||
. += mutable_appearance(icon_location, "belly_9_d", GENITALS_UNDER_LAYER)
|
||||
if(istype(O, /obj/item/organ/genital/anus)) //if that organ is the butt
|
||||
G = O
|
||||
if(suit_style == DIGITIGRADE_SUIT_STYLE) //check if the suit needs to use sprites for digitigrade characters
|
||||
if(G.size <= 10)
|
||||
. += mutable_appearance(icon_location, "butt_[G.size]_l", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance(icon_location, "butt_[G.size]_l_NORTH", GENITALS_FRONT_LAYER) //to not adjust overlays every time a character turns, north-facing breasts and bellies are drawn separately, with individual icons
|
||||
else //they'll have blank north-facing sprites in the main icon state and the north-facing will be blank on all other sides, and are drawn on different layers
|
||||
. += mutable_appearance(icon_location, "butt_10_l", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance(icon_location, "butt_10_l_NORTH", GENITALS_FRONT_LAYER)
|
||||
else //if the character is not digitigrade
|
||||
if(G.size <= 10)
|
||||
. += mutable_appearance(icon_location, "butt_[G.size]", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance(icon_location, "butt_[G.size]_NORTH", GENITALS_FRONT_LAYER)
|
||||
else
|
||||
. += mutable_appearance(icon_location, "butt_10", GENITALS_FRONT_LAYER)
|
||||
. += mutable_appearance(icon_location, "butt_10_NORTH", GENITALS_FRONT_LAYER)
|
||||
if(istype(O, /obj/item/organ/genital/breasts)) //if the organ is the breasts
|
||||
G = O
|
||||
if(G.size <= "o")
|
||||
. += mutable_appearance(icon_location, "breasts_[G.size]", GENITALS_BEHIND_LAYER)
|
||||
. += mutable_appearance(icon_location, "breasts_[G.size]_NORTH", BODY_FRONT_LAYER)
|
||||
else
|
||||
if(G.size == "huge")
|
||||
. += mutable_appearance(icon_location, "breasts_huge", GENITALS_BEHIND_LAYER)
|
||||
. += mutable_appearance(icon_location, "breasts_huge_NORTH", BODY_FRONT_LAYER)
|
||||
else
|
||||
if(G.size == "massive")
|
||||
. += mutable_appearance(icon_location, "breasts_massive", GENITALS_BEHIND_LAYER)
|
||||
. += mutable_appearance(icon_location, "breasts_massive_NORTH", BODY_FRONT_LAYER)
|
||||
else
|
||||
if(G.size == "giga")
|
||||
. += mutable_appearance(icon_location, "breasts_giga", GENITALS_BEHIND_LAYER)
|
||||
. += mutable_appearance(icon_location, "breasts_giga_NORTH", BODY_FRONT_LAYER)
|
||||
else
|
||||
. += mutable_appearance(icon_location, "breasts_impossible", GENITALS_BEHIND_LAYER)
|
||||
. += mutable_appearance(icon_location, "breasts_impossible_NORTH", BODY_FRONT_LAYER)
|
||||
if(damaged_clothes)
|
||||
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
|
||||
if(blood_DNA)
|
||||
. += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color())
|
||||
if(accessory_overlay)
|
||||
. += accessory_overlay
|
||||
|
||||
|
||||
/obj/item/clothing/under/color/grey/modular/bra
|
||||
name = "grey modular bra"
|
||||
desc = "A tasteful grey bra that reminds you of the good old days. Now adjusts to the match the wearer's size!"
|
||||
icon_location = 'GainStation13/icons/mob/modclothes/graymodular_bra.dmi'
|
||||
icon_state = "grey"
|
||||
item_state = "grey_bra"
|
||||
item_color = "grey_bra"
|
||||
@@ -0,0 +1,26 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// GS13 Drinks
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/fizzwiz
|
||||
name = "Fizz Wiz"
|
||||
desc = "Unleash your inner magic!"
|
||||
icon = 'GainStation13/icons/obj/drinks.dmi'
|
||||
lefthand_file = 'GainStation13/icons/obj/food_lefthand.dmi'
|
||||
righthand_file = 'GainStation13/icons/obj/food_righthand.dmi'
|
||||
icon_state = "fizzwiz"
|
||||
list_reagents = list(/datum/reagent/consumable/space_cola = 25, /datum/reagent/consumable/fizulphite = 15)
|
||||
foodtype = SUGAR
|
||||
price = 3
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/soothseltz
|
||||
name = "Soothing Seltzer"
|
||||
desc = "A useful drink that helps relieve a bloated stomach."
|
||||
icon = 'GainStation13/icons/obj/drinks.dmi'
|
||||
lefthand_file = 'GainStation13/icons/obj/food_lefthand.dmi'
|
||||
righthand_file = 'GainStation13/icons/obj/food_righthand.dmi'
|
||||
icon_state = "soothseltz"
|
||||
list_reagents = list(/datum/reagent/consumable/space_cola = 25, /datum/reagent/consumable/extilphite = 15)
|
||||
foodtype = SUGAR
|
||||
price = 3
|
||||
@@ -0,0 +1,139 @@
|
||||
/obj/item/reagent_containers/food/snacks/gbburrito
|
||||
name = "\improper GATO Gas Giant Burrito"
|
||||
icon_state = "gbburrito"
|
||||
desc = "More than three pounds of beans, meat, and cheese wrapped in a greasy tortilla. It's piping hot."
|
||||
trash = null
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/flatulose = 4, /datum/reagent/consumable/sodiumchloride = 0.5)
|
||||
filling_color = "#74291b"
|
||||
tastes = list("refried beans","grease" = 1)
|
||||
foodtype = MEAT
|
||||
price = 3
|
||||
|
||||
//these have been ported from CHOMPstation / Virgo
|
||||
/obj/item/reagent_containers/food/snacks/doner_kebab
|
||||
name = "doner kebab"
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
desc = "A delicious sandwich-like food from ancient Earth. The meat is typically cooked on a vertical rotisserie."
|
||||
icon_state = "doner_kebab"
|
||||
trash = null
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 10)
|
||||
filling_color = "#93684d"
|
||||
tastes = list("thinly sliced meat","meat" = 1)
|
||||
foodtype = GRAIN | VEGETABLES | MEAT | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/lasagna
|
||||
name = "lasagna"
|
||||
desc = "Meaty, tomato-y, and ready to eat-y. Favorite of cats."
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
icon_state = "lasagna"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 10)
|
||||
filling_color = "#872020"
|
||||
tastes = list("italian cuisine" = 1)
|
||||
foodtype = GRAIN | VEGETABLES | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/corndog
|
||||
name = "corn dog"
|
||||
desc = "A cornbread covered sausage deepfried in oil."
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
icon_state = "corndog"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 5)
|
||||
filling_color = "#df9745"
|
||||
tastes = list("corn batter", "sausage" = 1)
|
||||
foodtype = GRAIN | MEAT | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/turkey
|
||||
name = "turkey"
|
||||
desc = "Tastes like chicken. It can be sliced!"
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
icon_state = "turkey"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/turkey_leg
|
||||
slices_num = 4
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 15)
|
||||
filling_color = "#d4864b"
|
||||
tastes = list("turkey" = 1)
|
||||
foodtype = MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/turkey_leg
|
||||
name = "turkey leg"
|
||||
desc = "Tastes like chicken."
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
icon_state = "turkey_slice"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 5)
|
||||
filling_color = "#ae6941"
|
||||
tastes = list("turkey" = 1)
|
||||
foodtype = MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/brownies
|
||||
name = "brownies"
|
||||
desc = "Halfway to fudge, or halfway to cake? Who cares!"
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
icon_state = "brownies"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/brownies_slice
|
||||
slices_num = 6
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 30)
|
||||
filling_color = "#392f27"
|
||||
tastes = list("chocolate" = 1)
|
||||
foodtype = GRAIN | SUGAR | DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/brownies_slice
|
||||
name = "brownie"
|
||||
desc = "a dense, decadent chocolate brownie."
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
icon_state = "browniesslice"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 5)
|
||||
filling_color = "#392f27"
|
||||
tastes = list("chocolate" = 1)
|
||||
foodtype = GRAIN | SUGAR | DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/brownies_cosmic
|
||||
name = "cosmic brownies"
|
||||
desc = "The power of cosmos likes within your hand."
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
icon_state = "cosmicbrownies"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/brownies_slice_cosmic
|
||||
slices_num = 6
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/medicine/omnizine = 5)
|
||||
filling_color = "#392f27"
|
||||
tastes = list("chocolate" = 1)
|
||||
foodtype = GRAIN | SUGAR | DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/brownies_slice_cosmic
|
||||
name = "cosmic brownie"
|
||||
desc = "a dense, decadent and fun-looking chocolate brownie."
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
icon_state = "cosmicbrownieslice"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/omnizine = 1)
|
||||
filling_color = "#392f27"
|
||||
tastes = list("chocolate" = 1)
|
||||
foodtype = GRAIN | SUGAR | DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/bacon_and_eggs
|
||||
name = "bacon and eggs"
|
||||
desc = "A staple of every breakfast."
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
icon_state = "bacon_and_eggs"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 8)
|
||||
filling_color = "#e9e6e3"
|
||||
tastes = list("eggs", "bacon" = 1)
|
||||
foodtype = BREAKFAST | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/eggmuffin
|
||||
name = "egg muffin"
|
||||
desc = "A staple of every breakfast."
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
icon_state = "eggmuffin"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 8)
|
||||
filling_color = "#e9e6e3"
|
||||
tastes = list("eggs", "breakfast" = 1)
|
||||
foodtype = BREAKFAST | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cinammonbun
|
||||
name = "cinammon bun"
|
||||
desc = "Careful not to have it stolen."
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
icon_state = "cinammonbun"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 5)
|
||||
filling_color = "#e9e6e3"
|
||||
tastes = list("eggs", "breakfast" = 1)
|
||||
foodtype = GRAIN | SUGAR
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
//GS13 decals - candyland related!
|
||||
//would be cool if we could use ash flora code to make these harvestable in the future - Lew
|
||||
|
||||
|
||||
/obj/effect/turf_decal/candy //used for baseline
|
||||
icon = 'GainStation13/icons/turf/decals_candy.dmi'
|
||||
icon_state = ""
|
||||
|
||||
/obj/effect/turf_decal/candy/redwhite
|
||||
icon = 'GainStation13/icons/turf/decals_candy.dmi'
|
||||
icon_state = "candy_decal1"
|
||||
|
||||
/obj/effect/turf_decal/candy/redwhite2
|
||||
icon = 'GainStation13/icons/turf/decals_candy.dmi'
|
||||
icon_state = "candy_decal2"
|
||||
|
||||
/obj/effect/turf_decal/candy/redwhite3
|
||||
icon = 'GainStation13/icons/turf/decals_candy.dmi'
|
||||
icon_state = "candy_decal3"
|
||||
|
||||
/obj/effect/turf_decal/candy/greenwhite1
|
||||
icon = 'GainStation13/icons/turf/decals_candy.dmi'
|
||||
icon_state = "candy_decal_g1"
|
||||
|
||||
/obj/effect/turf_decal/candy/greenwhite2
|
||||
icon = 'GainStation13/icons/turf/decals_candy.dmi'
|
||||
icon_state = "candy_decal_g2"
|
||||
|
||||
/obj/effect/turf_decal/candy/bluewhite1
|
||||
icon = 'GainStation13/icons/turf/decals_candy.dmi'
|
||||
icon_state = "candy_decal_b1"
|
||||
|
||||
/obj/effect/turf_decal/candy/purplewhite1
|
||||
icon = 'GainStation13/icons/turf/decals_candy.dmi'
|
||||
icon_state = "candy_decal_p1"
|
||||
|
||||
|
||||
/obj/structure/lollipop //ik it's not necessarily a decal but I'm lazy rn and will (hopefully) move it later
|
||||
name = "Lollipop tree"
|
||||
desc = "A mere snack for people larger than life."
|
||||
max_integrity = 80
|
||||
density = TRUE
|
||||
pixel_x = -16
|
||||
layer = FLY_LAYER
|
||||
anchored = TRUE
|
||||
icon = 'GainStation13/icons/turf/decals_large_candy.dmi'
|
||||
icon_state = "lollipop_tree_blue"
|
||||
@@ -0,0 +1,126 @@
|
||||
//this is a recipe file for just random shit we've ported from other servers
|
||||
//you can call me lazy if you'd like but I didn't really feel like making 10 different folders and files just to port a couple simple meals
|
||||
|
||||
//writing down recipe categories, should be handy
|
||||
//CAT_FOOD,CAT_BREAD,CAT_BURGER,CAT_CAKE,CAT_EGG,CAT_MEAT,CAT_MISCFOOD,CAT_PASTRY,CAT_PIE,CAT_PIZZ,CAT_SALAD,CAT_SANDWICH,CAT_SOUP,CAT_SPAGHETTI,CAT_FISH,CAT_ICE
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/doner
|
||||
name = "Doner Kebab"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/bun = 1,
|
||||
/obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/tomato = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/doner_kebab
|
||||
subcategory = CAT_BURGER
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/lasagna
|
||||
name = "Lasagna"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/boiledspaghetti = 1,
|
||||
/obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/tomato = 1,
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/lasagna
|
||||
subcategory = CAT_SPAGHETTI
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/corndog
|
||||
name = "Corndog"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/flour = 5,
|
||||
/obj/item/reagent_containers/food/snacks/sausage = 1,
|
||||
/datum/reagent/consumable/cooking_oil = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/corndog
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/turkey
|
||||
name = "Whole Turkey"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/chicken = 2,
|
||||
/obj/item/reagent_containers/food/snacks/sausage = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/potato = 2,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/turkey
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/brownies
|
||||
name = "Brownies"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/flour = 5,
|
||||
/datum/reagent/consumable/ethanol/creme_de_cacao = 10,
|
||||
/datum/reagent/consumable/sugar = 5,
|
||||
/obj/item/reagent_containers/food/snacks/butter = 2
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/brownies
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/cosmic_brownies
|
||||
name = "Cosmic Brownies"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/brownies = 1,
|
||||
/datum/reagent/consumable/sprinkles = 10
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/brownies_cosmic
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/cosmic_brownies
|
||||
name = "Cosmic Brownies"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/brownies = 1,
|
||||
/datum/reagent/consumable/sprinkles = 10
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/brownies_cosmic
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/bacon_and_eggs
|
||||
name = "Bacon and Eggs"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/friedegg = 2,
|
||||
/obj/item/reagent_containers/food/snacks/meat/bacon = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/bacon_and_eggs
|
||||
subcategory = CAT_EGG
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/egg_muffin
|
||||
name = "Egg muffin"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/friedegg = 1,
|
||||
/obj/item/reagent_containers/food/snacks/muffin = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/eggmuffin
|
||||
subcategory = CAT_EGG
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/cinnamon_roll
|
||||
name = "Cinnamon roll"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/sugar = 3,
|
||||
/datum/reagent/consumable/vanilla = 2,
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/cinammonbun
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
//GS Food
|
||||
|
||||
/datum/crafting_recipe/food/lavaland_stew
|
||||
name = "Lavaland Stew"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit = 2,
|
||||
/obj/item/reagent_containers/glass/bowl/mushroom_bowl = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/soup/lavaland_stew
|
||||
subcategory = CAT_SOUP
|
||||
@@ -0,0 +1,93 @@
|
||||
|
||||
// see code/module/crafting/table.dm
|
||||
|
||||
////////////////////////////////////////////////PIZZA!!!////////////////////////////////////////////////
|
||||
|
||||
//GS13 - this has been ported from CHOMP/Virgo, but I've decided to adjust the recipe a bit
|
||||
// there's both the recipe and the defines for the pizza itself here
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pizza/framewrecker
|
||||
name = "Framewrecker Pizza"
|
||||
desc = "You feel your arteries clogging just by merely looking at this monster. Is this even real, or a mere hallucination?"
|
||||
icon = 'icons/obj/food/food64x64.dmi'
|
||||
icon_state = "theonepizza"
|
||||
pixel_x = -16
|
||||
pixel_y = -16
|
||||
inhand_x_dimension = 64
|
||||
inhand_y_dimension = 64
|
||||
bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 200, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 20)
|
||||
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "overwhelming surge of calories" = 10)
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD | ANTITOXIC
|
||||
|
||||
var/slicelist = list(/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/mushroom,
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/veggie,
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/cheese,
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/pineapple,
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/meat)
|
||||
|
||||
|
||||
|
||||
//slices
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker
|
||||
name = "Framewrecker Pizza Slice"
|
||||
desc = "This mere slice is the size of pizza on its own!"
|
||||
icon = 'icons/obj/food/ported_meals.dmi'
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 60)
|
||||
icon_state = "big_mushroom_slice"
|
||||
filling_color = "#FFA500"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/mushroom
|
||||
name = "Giant mushroom pizza slice"
|
||||
icon_state = "big_mushroom_slice"
|
||||
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "mushrooms" = 1, "delight" = 5)
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/veggie
|
||||
name = "Giant veggie pizza slice"
|
||||
icon_state = "big_veggie_slice"
|
||||
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "veggies" = 1, "delight" = 5)
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/pineapple
|
||||
name = "Giant pineapple pizza slice"
|
||||
icon_state = "big_pineapple_slice"
|
||||
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "ham" = 1, "pineapple" = 5)
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | JUNKFOOD | FRUIT
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/meat
|
||||
name = "Giant meat pizza slice"
|
||||
icon_state = "big_veggie_slice"
|
||||
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "delight" = 5)
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | JUNKFOOD | MEAT
|
||||
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/cheese
|
||||
name = "Giant cheese pizza slice"
|
||||
icon_state = "big_cheese_slice"
|
||||
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "delight" = 5)
|
||||
foodtype = GRAIN | VEGETABLES | DAIRY | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pizza/framewrecker/attackby(var/obj/item/weapon/W, var/mob/living/user)
|
||||
if(istype(W,/obj/item/kitchen/knife))
|
||||
user.visible_message("<b>\The [user]</b> starts to slowly cut through The One Pizza.", "<span class='notice'>You start to slowly cut through The One Pizza.</span>")
|
||||
if(!src)
|
||||
return // We got disappeared already
|
||||
user.visible_message("<b>\The [user]</b> successfully cuts The One Pizza.", "<span class='notice'>You successfully cut The One Pizza.</span>")
|
||||
for(var/slicetype in slicelist)
|
||||
new slicetype(src.loc)
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
// recipe
|
||||
|
||||
/datum/crafting_recipe/food/framewrecker_pizza
|
||||
name = "Framewrecker Pizza"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/pizzabread = 4,
|
||||
/obj/item/reagent_containers/food/snacks/meat/cutlet = 4,
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge = 8,
|
||||
/obj/item/reagent_containers/food/snacks/grown/tomato = 8,
|
||||
/obj/item/reagent_containers/food/snacks/pineappleslice = 2,
|
||||
/obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle = 2
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/pizza/framewrecker
|
||||
subcategory = CAT_PIZZA
|
||||
@@ -0,0 +1,113 @@
|
||||
/obj/item/dumbbell
|
||||
desc = "A weighty dumbbell, perfect for arm exercise!"
|
||||
name = "dumbbell"
|
||||
icon = 'GainStation13/icons/obj/dumbbell.dmi'
|
||||
icon_state = "pen"
|
||||
item_state = "pen"
|
||||
throwforce = 20
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
throw_speed = 2
|
||||
throw_range = 3
|
||||
materials = list(MAT_METAL=10)
|
||||
pressure_resistance = 2
|
||||
var/reps = 0
|
||||
var/using = FALSE
|
||||
|
||||
/obj/item/dumbbell/dropped(mob/user, silent)
|
||||
reps = 0
|
||||
. = ..()
|
||||
|
||||
/obj/item/dumbbell/attack_self(mob/user)
|
||||
. = ..()
|
||||
if(!using)
|
||||
using = TRUE
|
||||
to_chat(user, "<span>You do a rep with the [src]. YEEEEEAH!!!</span>")
|
||||
if(do_after(usr, CLICK_CD_RESIST-reps, 0, usr, 1))
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/U = user
|
||||
U.adjust_fatness(-10, FATTENING_TYPE_WEIGHT_LOSS)
|
||||
if(reps < 16)
|
||||
reps += 0.4
|
||||
else
|
||||
to_chat(user, "<span>You couldn't complete the rep. YOU'LL GET IT NEXT TIME CHAMP!!!</span>")
|
||||
using = FALSE
|
||||
|
||||
/obj/machinery/treadmill
|
||||
name = "treadmill"
|
||||
desc = "A treadmil, for losing weight!"
|
||||
icon = 'icons/obj/recycling.dmi'
|
||||
icon_state = "conveyor0"
|
||||
circuit = /obj/item/circuitboard/machine/treadmill
|
||||
|
||||
var/fatloss = -10
|
||||
|
||||
/obj/machinery/treadmill/Uncross(atom/movable/AM, atom/newloc)
|
||||
if(stat & BROKEN)
|
||||
return ..()
|
||||
if(!isliving(AM))
|
||||
return ..()
|
||||
var/mob/living/M = AM
|
||||
if(M.throwing || M.floating || M.is_flying()) //Make sure they're not going over it
|
||||
return ..()
|
||||
if(AM.dir != dir) //Make sure they're going into the treadmill
|
||||
return ..()
|
||||
if(prob(25))
|
||||
playsound(src, "sound/machines/tractor_running.ogg", 25, TRUE, -2) //Rumblin'
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(C.fatness > FATNESS_LEVEL_BARELYMOBILE)
|
||||
if(prob(5))
|
||||
visible_message(pick(list( //Really testing the poor thing, huh?
|
||||
"\the [src] audibly strains under [C]'s weight...",
|
||||
"\the [src] creeaaaaks under [C]'s strain..."
|
||||
)))
|
||||
C.adjust_fatness(fatloss, FATTENING_TYPE_WEIGHT_LOSS)
|
||||
flick("conveyor-1", src)
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/treadmill/RefreshParts(obj/item/O, mob/user, params)
|
||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||
fatloss += M.rating * -10
|
||||
|
||||
/obj/machinery/treadmill/attackby(obj/item/O, mob/living/user, params)
|
||||
if(default_deconstruction_screwdriver(user, "conveyor0", "conveyor0", O))
|
||||
return TRUE
|
||||
|
||||
if(default_deconstruction_crowbar(O))
|
||||
return TRUE
|
||||
|
||||
if(default_change_direction_wrench(O))
|
||||
return TRUE
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/circuitboard/machine/treadmill
|
||||
name = "Treadmill (Machine Board)"
|
||||
build_path = /obj/machinery/autolathe
|
||||
req_components = list(/obj/item/stock_parts/manipulator = 1)
|
||||
|
||||
/datum/design/treadmill
|
||||
name = "Treadmill Board"
|
||||
id = "treadmill"
|
||||
build_type = AUTOLATHE | PROTOLATHE
|
||||
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
|
||||
build_path = /obj/item/circuitboard/machine/treadmill
|
||||
category = list("inital", "Construction")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/dumbbell
|
||||
name = "Dumbbell"
|
||||
id = "dumbbell"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 2000)
|
||||
build_path = /obj/item/dumbbell
|
||||
category = list("initial", "Tools")
|
||||
/*
|
||||
/datum/design/treadmill
|
||||
name = "Treadmill"
|
||||
id = "treadmill"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 5000)
|
||||
build_path = /obj/item/conveyor_construct/treadmill
|
||||
category = list("initial", "Construction")
|
||||
*/
|
||||
@@ -0,0 +1,25 @@
|
||||
/obj/item/seeds/berry/blueberry
|
||||
name = "pack of blueberry seeds"
|
||||
desc = "These seeds grow into blueberry bushes."
|
||||
icon_state = "seed-blueberry"
|
||||
species = "blueberry"
|
||||
plantname = "Blueberry Bush"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/berries/blueberry
|
||||
mutatelist = list()
|
||||
reagents_add = list(/datum/reagent/blueberry_juice = 0.1)
|
||||
potency = 1
|
||||
yield = 1
|
||||
production = 10
|
||||
rarity = 30
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/berries/blueberry
|
||||
seed = /obj/item/seeds/berry/blueberry
|
||||
name = "bunch of blueberries"
|
||||
desc = "Taste so good, you might turn blue!"
|
||||
icon_state = "blueberrypile"
|
||||
filling_color = "#5d00c7"
|
||||
foodtype = FRUIT
|
||||
juice_results = list(/datum/reagent/blueberry_juice = 20)
|
||||
tastes = list("blueberry" = 1)
|
||||
distill_reagent = null
|
||||
wine_power = 50
|
||||
@@ -0,0 +1,127 @@
|
||||
/obj/item/seeds/lipoplant
|
||||
name = "pack of adipolipus"
|
||||
desc = "These seeds grow into a foreign plant."
|
||||
icon = 'GainStation13/icons/obj/hydroponics/lipo_seeds.dmi'
|
||||
icon_state = "lipo_seed"
|
||||
species = "adipolipus"
|
||||
plantname = "Adipolipus"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/lipofruit
|
||||
lifespan = 30
|
||||
potency = 20
|
||||
maturation = 8
|
||||
production = 5
|
||||
yield = 1
|
||||
growing_icon = 'GainStation13/icons/obj/hydroponics/lipo_growing.dmi'
|
||||
icon_grow = "lipo-grow" // Uses one growth icons set for all the subtypes
|
||||
icon_dead = "lipo-dead" // Same for the dead icon
|
||||
icon_harvest = "lipo-harvest"
|
||||
reagents_add = list(/datum/reagent/consumable/lipoifier = 0.05)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/lipofruit
|
||||
seed = /obj/item/seeds/lipoplant
|
||||
name = "lipofruit"
|
||||
desc = "A foreign fruit with an hard shell. Perhaps something sharp could open it?"
|
||||
icon = 'GainStation13/icons/obj/hydroponics/lipo_harvest.dmi'
|
||||
icon_state = "lipo_nut"
|
||||
item_state = "lipo_nut"
|
||||
possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50)
|
||||
spillable = FALSE
|
||||
resistance_flags = ACID_PROOF
|
||||
volume = 150 //so it won't cut reagents despite having the capacity for them
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
force = 5
|
||||
throwforce = 5
|
||||
hitsound = 'sound/weapons/klonk.ogg'
|
||||
attack_verb = list("klonked", "donked", "bonked")
|
||||
distill_reagent = "creme_de_coconut"
|
||||
var/opened = FALSE
|
||||
sharpness = IS_BLUNT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/lipofruit/attackby(obj/item/W, mob/user, params)
|
||||
if(!opened && W.sharpness)
|
||||
user.show_message("<span class='notice'>You slice the fruit open!</span>", 1)
|
||||
opened = TRUE
|
||||
spillable = TRUE
|
||||
reagent_flags = OPENCONTAINER
|
||||
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||
icon_state = "lipo_nutcut_full"
|
||||
desc = "A foreign fruit with an hard shell, the liquid inside looks very inviting."
|
||||
playsound(user, W.hitsound, 50, 1, -1)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/lipofruit/attack(mob/living/M, mob/user, obj/target)
|
||||
if(!opened)
|
||||
return
|
||||
if(!canconsume(M, user))
|
||||
return
|
||||
if(!reagents || !reagents.total_volume)
|
||||
to_chat(user, "<span class='warning'>[src] is empty!</span>")
|
||||
return
|
||||
|
||||
if(user.a_intent == INTENT_HARM && spillable)
|
||||
var/R
|
||||
M.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [M]!</span>",
|
||||
"<span class='userdanger'>[user] splashes the contents of [src] onto [M]!</span>")
|
||||
if(reagents)
|
||||
for(var/datum/reagent/A in reagents.reagent_list)
|
||||
R += A.type + " ("
|
||||
R += num2text(A.volume) + "),"
|
||||
if(isturf(target) && reagents.reagent_list.len && thrownby)
|
||||
log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]")
|
||||
message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].")
|
||||
reagents.reaction(M, TOUCH)
|
||||
log_combat(user, M, "splashed", R)
|
||||
reagents.clear_reagents()
|
||||
else
|
||||
if(M != user)
|
||||
M.visible_message("<span class='danger'>[user] attempts to feed something to [M].</span>",
|
||||
"<span class='userdanger'>[user] attempts to feed something to you.</span>")
|
||||
if(!do_mob(user, M))
|
||||
return
|
||||
if(!reagents || !reagents.total_volume)
|
||||
return // The drink might be empty after the delay, such as by spam-feeding
|
||||
M.visible_message("<span class='danger'>[user] feeds something to [M].</span>", "<span class='userdanger'>[user] feeds something to you.</span>")
|
||||
log_combat(user, M, "fed", reagents.log_list())
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You swallow a gulp of [src].</span>")
|
||||
var/fraction = min(5/reagents.total_volume, 1)
|
||||
reagents.reaction(M, INGEST, fraction)
|
||||
addtimer(CALLBACK(reagents, TYPE_PROC_REF(/datum/reagents, trans_to), M, 5), 5)
|
||||
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
||||
if(!reagents || reagents.total_volume)
|
||||
icon_state = "lipo_nutcut_empty"
|
||||
desc = "A foreign fruit with an hard shell."
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/lipofruit/afterattack(obj/target, mob/user, proximity)
|
||||
. = ..()
|
||||
if((!proximity) || !check_allowed_items(target,target_self=1))
|
||||
return
|
||||
if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it.
|
||||
if(!reagents.total_volume)
|
||||
to_chat(user, "<span class='warning'>[src] is empty!</span>")
|
||||
return
|
||||
if(target.reagents.holder_full())
|
||||
to_chat(user, "<span class='warning'>[target] is full.</span>")
|
||||
return
|
||||
var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
|
||||
to_chat(user, "<span class='notice'>You transfer [trans] unit\s of the solution to [target].</span>")
|
||||
else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us.
|
||||
if(!target.reagents.total_volume)
|
||||
to_chat(user, "<span class='warning'>[target] is empty and can't be refilled!</span>")
|
||||
return
|
||||
if(reagents.holder_full())
|
||||
to_chat(user, "<span class='warning'>[src] is full.</span>")
|
||||
return
|
||||
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
|
||||
to_chat(user, "<span class='notice'>You fill [src] with [trans] unit\s of the contents of [target].</span>")
|
||||
else if(reagents.total_volume)
|
||||
if(user.a_intent == INTENT_HARM && spillable == TRUE)
|
||||
user.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [target]!</span>", \
|
||||
"<span class='notice'>You splash the contents of [src] onto [target].</span>")
|
||||
reagents.reaction(target, TOUCH)
|
||||
reagents.clear_reagents()
|
||||
if(reagents && reagents.total_volume && opened)
|
||||
icon_state = "lipo_nutcut_full"
|
||||
desc = "A foreign fruit with an hard shell, the liquid inside looks very inviting."
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/mob/living/carbon
|
||||
var/nutri_mult = 1
|
||||
|
||||
/obj/item/seeds/cannabis/munchies
|
||||
name = "pack of munchies weed seeds"
|
||||
desc = "These seeds grow into munchies weed."
|
||||
icon_state = "seed-munchies"
|
||||
species = "munchycannabis"
|
||||
plantname = "Munchies Weed"
|
||||
icon_grow = "munchycannabis-grow" // Uses one growth icons set for all the subtypes
|
||||
icon_dead = "munchycannabis-dead" // Same for the dead icon
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/cannabis/munchies
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/orange)
|
||||
mutatelist = list()
|
||||
reagents_add = list(/datum/reagent/drug/space_drugs = 0.05,
|
||||
/datum/reagent/drug/munchies = 0.10)
|
||||
rarity = 69
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/cannabis/munchies
|
||||
seed = /obj/item/seeds/cannabis/munchies
|
||||
name = "munchies cannabis leaf"
|
||||
desc = "You feel hungry just looking at it."
|
||||
icon_state = "munchycannabis"
|
||||
wine_power = 90
|
||||
|
||||
/datum/reagent/drug/munchies
|
||||
name = "Appetite Stimulant"
|
||||
value = 6
|
||||
description = "A chemical compound that makes one mindlessly ravenous."
|
||||
color = "#60A584"
|
||||
pH = 9
|
||||
metabolization_rate = REAGENTS_METABOLISM / 4
|
||||
|
||||
/datum/reagent/drug/munchies/on_mob_add(mob/living/L, amount)
|
||||
. = ..()
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
C.nutri_mult += 0.5
|
||||
|
||||
/datum/reagent/drug/munchies/on_mob_delete(mob/living/L)
|
||||
. = ..()
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
C.nutri_mult -= 0.5
|
||||
|
||||
/datum/reagent/drug/munchies/on_mob_life(mob/living/carbon/M)
|
||||
. = ..()
|
||||
if(prob(10))
|
||||
to_chat(M, "<span class='warning'>[pick("You feel a little ravenous...", "You could really go for a snack right now...", "The taste of food seems really enticing right now...", "Your belly groans, demanding food...")]</span>")
|
||||
if(M.fullness > 10)
|
||||
M.fullness -= 1
|
||||
if(M.nutrition > 150)
|
||||
M.nutrition -= 1
|
||||
@@ -0,0 +1,100 @@
|
||||
/datum/emote/living/gurgle
|
||||
key = "gurgle"
|
||||
key_third_person = "gurgles"
|
||||
message = "'s belly gurgles"
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
sound = 'GainStation13/sound/voice/gurgle1.ogg'
|
||||
|
||||
/datum/emote/living/gurgle/get_sound()
|
||||
return get_sfx("gurgle") // Lets get any of the gurgle sounds we have set.
|
||||
|
||||
/datum/emote/living/burp
|
||||
key = "burp"
|
||||
key_third_person = "burps"
|
||||
message = "burps"
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
var/reduction_min = 4
|
||||
var/reduction_max = 8
|
||||
var/noise_type = "burp"
|
||||
var/noise_pref = BURPING_NOISES
|
||||
|
||||
/datum/emote/living/burp/run_emote(mob/living/user, params)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
|
||||
playsound_prefed(user, noise_type, noise_pref, 100, TRUE, -4)
|
||||
|
||||
user.reduce_fullness(rand(reduction_min,reduction_max))
|
||||
|
||||
/datum/emote/living/burp/fart //Butt burp.
|
||||
key = "fart"
|
||||
key_third_person = "farts"
|
||||
message = "farts"
|
||||
//god hates me for this -Metha
|
||||
noise_type = "fart"
|
||||
noise_pref = FARTING_NOISES
|
||||
|
||||
/datum/emote/living/burp/fart/run_emote(mob/living/user, params)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
|
||||
var/obj/item/storage/book/bible/b = locate(/obj/item/storage/book/bible) in get_turf(user) //Biblefart
|
||||
if(b)//Devine Retribution
|
||||
var/mob/living/heretic = user //Heresy.
|
||||
heretic.visible_message(
|
||||
"<span class='danger'>\The [heretic] farts on \the [b], causing a violent, otherworldly ripple to echo \
|
||||
outwards before they explode in a gorey mess of divine retribution!</span>",
|
||||
"<span class='userdanger'>You feel a deep sense of dread as you release pressure from your rear over \the [b], \
|
||||
immediately realizing your mistake as Divine Retribution rends your form into a gorey mess.</span>")
|
||||
heretic.emote("scream")
|
||||
message_admins("[ADMIN_LOOKUPFLW(heretic)] farted on a bible at [ADMIN_VERBOSEJMP(heretic)] and was gibbed.")
|
||||
log_game("[key_name(heretic)] farted on a bible at [AREACOORD(heretic)] and was gibbed")
|
||||
heretic.gib()
|
||||
return //Gassy is dead
|
||||
|
||||
/datum/emote/living/burp/belch
|
||||
key = "belch"
|
||||
key_third_person = "belches loudly"
|
||||
message = "belches"
|
||||
//god hates me for this -Metha
|
||||
noise_type = "belch"
|
||||
reduction_min = 6
|
||||
reduction_max = 12
|
||||
|
||||
/datum/emote/living/burp/fart/brap
|
||||
key = "brap"
|
||||
key_third_person = "braps"
|
||||
message = ""
|
||||
reduction_min = 6
|
||||
reduction_max = 12
|
||||
|
||||
/datum/emote/living/burp/fart/brap/select_message_type(var/mob/living/user)
|
||||
return pick("farts loudly!", "cuts a fat one!", "rips absolute ass!")
|
||||
|
||||
/datum/emote/living/burp/fart/goon // Fart but it's funny !
|
||||
key = "goonfart"
|
||||
key_third_person = "goonfarts"
|
||||
noise_type = 'goon/sound/voice/farts/fart4.ogg'
|
||||
|
||||
//Shhh... It's a secret! Don't tell or I'll steal your legs
|
||||
/datum/emote/living/burunyu
|
||||
key = "burunyu"
|
||||
key_third_person = "burunyues"
|
||||
message = "emits a strange feline sound"
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
sound = 'GainStation13/sound/voice/funnycat.ogg'
|
||||
|
||||
/datum/emote/living/bellyrub
|
||||
key = "bellyrub"
|
||||
key_third_person = "bellyrubs"
|
||||
message = "rubs their belly"
|
||||
emote_type = EMOTE_VISIBLE
|
||||
|
||||
/datum/emote/living/bellyrub/run_emote(mob/living/user, params)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
|
||||
user.reduce_fullness(rand(4,16), FALSE)
|
||||
@@ -0,0 +1,4 @@
|
||||
// This is a file for emotes that have been rewritten to be more modular. Such as varying based on species or whathave you. May move this later or something.
|
||||
|
||||
|
||||
//I was going to put screams in here but I overhauled it in a different more austistic way
|
||||
@@ -0,0 +1,239 @@
|
||||
// This is an emote file for random shit we've ported. Im just copying the style recipes_ported.dm did, yell at me if im wrong later.
|
||||
// It said it was lazy but personally I think this might be a better way of organizing otherwise unique content that we're porting
|
||||
// for ourselves. -Reo
|
||||
|
||||
// I found this tacked onto the bottom of code/modules/mob/living/emote.dm. No //code add: notice or anything. Moving it here,
|
||||
// since it seems to all be ported emotes. -Reo
|
||||
/*
|
||||
//Carl wuz here
|
||||
//FUCK YOU CARL SUCK MY BALLS YOU WHORE
|
||||
/datum/emote/living/tesh_sneeze
|
||||
key = "tesh_sneeze"
|
||||
key_third_person = "sneezes"
|
||||
message = "sneezes."
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
/datum/emote/living/tesh_sneeze/can_run_emote(mob/living/user, status_check = TRUE)
|
||||
. = ..()
|
||||
if(. && iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
return !C.silent
|
||||
|
||||
/datum/emote/living/tesh_sneeze/run_emote(mob/user, params)
|
||||
. = ..()
|
||||
if(. && iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
if(!C.mind || C.mind.miming)//no cute sneezing for you.
|
||||
return
|
||||
if(ishumanbasic(C))
|
||||
playsound(C, pick('hyperstation/sound/voice/emotes/tesh_sneeze1.ogg', 'hyperstation/sound/voice/emotes/tesh_sneeze1b.ogg'), 50, 1)
|
||||
if(is_species(user, /datum/species/avian))//This is required(related to subtypes), otherwise it doesn't play the noises. Sometimes. Always sometimes. Just how it be.
|
||||
playsound(C, pick('hyperstation/sound/voice/emotes/tesh_sneeze1.ogg', 'hyperstation/sound/voice/emotes/tesh_sneeze1b.ogg'), 50, 1)
|
||||
if(is_species(user, /datum/species/mammal))//Just because the avian subspecies doesn't have proper sprites. Some people can't use it.
|
||||
playsound(C, pick('hyperstation/sound/voice/emotes/tesh_sneeze1.ogg', 'hyperstation/sound/voice/emotes/tesh_sneeze1b.ogg'), 50, 1)
|
||||
|
||||
/datum/emote/living/racc
|
||||
key = "racc_chitter"
|
||||
key_third_person = "chitters"
|
||||
message = "chitters."
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
/datum/emote/living/racc/can_run_emote(mob/living/user, status_check = TRUE)
|
||||
. = ..()
|
||||
if(. && iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
return !C.silent
|
||||
|
||||
/datum/emote/living/racc/run_emote(mob/user, params)
|
||||
. = ..()
|
||||
if(. && iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
if(!C.mind || C.mind.miming)
|
||||
return
|
||||
if(ishumanbasic(C))
|
||||
playsound(C, pick('hyperstation/sound/voice/emotes/racc_chitter_1.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_2.ogg',\
|
||||
'hyperstation/sound/voice/emotes/racc_chitter_3.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_4.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_5.ogg',\
|
||||
'hyperstation/sound/voice/emotes/racc_chitter_6.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_7.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_8.ogg'), 50, 1)
|
||||
if(is_species(user, /datum/species/mammal))
|
||||
playsound(C, pick('hyperstation/sound/voice/emotes/racc_chitter_1.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_2.ogg',\
|
||||
'hyperstation/sound/voice/emotes/racc_chitter_3.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_4.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_5.ogg',\
|
||||
'hyperstation/sound/voice/emotes/racc_chitter_6.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_7.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_8.ogg'), 50, 1)
|
||||
|
||||
/datum/emote/living/bat
|
||||
key = "bat_chitter"
|
||||
key_third_person = "chitters"
|
||||
message = "chitters."
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
/datum/emote/living/bat/can_run_emote(mob/living/user, status_check = TRUE)
|
||||
. = ..()
|
||||
if(. && iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
return !C.silent
|
||||
|
||||
/datum/emote/living/bat/run_emote(mob/user, params)
|
||||
. = ..()
|
||||
if(. && iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
if(!C.mind || C.mind.miming)
|
||||
return
|
||||
if(ishumanbasic(C))
|
||||
playsound(C, pick('hyperstation/sound/voice/emotes/bat_c1.ogg', 'hyperstation/sound/voice/emotes/bat_c2.ogg', 'hyperstation/sound/voice/emotes/bat_c3.ogg',\
|
||||
'hyperstation/sound/voice/emotes/bat_c4.ogg', 'hyperstation/sound/voice/emotes/bat_c5.ogg',\
|
||||
'hyperstation/sound/voice/emotes/bat_c6.ogg', 'hyperstation/sound/voice/emotes/bat_c7.ogg', 'hyperstation/sound/voice/emotes/bat_c8.ogg',\
|
||||
'hyperstation/sound/voice/emotes/bat_c9.ogg'), 50, 1)
|
||||
if(is_species(user, /datum/species/mammal))
|
||||
playsound(C, pick('hyperstation/sound/voice/emotes/bat_c1.ogg', 'hyperstation/sound/voice/emotes/bat_c2.ogg', 'hyperstation/sound/voice/emotes/bat_c3.ogg',\
|
||||
'hyperstation/sound/voice/emotes/bat_c4.ogg', 'hyperstation/sound/voice/emotes/bat_c5.ogg',\
|
||||
'hyperstation/sound/voice/emotes/bat_c6.ogg', 'hyperstation/sound/voice/emotes/bat_c7.ogg', 'hyperstation/sound/voice/emotes/bat_c8.ogg',\
|
||||
'hyperstation/sound/voice/emotes/bat_c9.ogg'), 50, 1)
|
||||
if(is_species(user, /datum/species/avian))//this and mammal should be considered the same AAAAAAAAAAAA
|
||||
playsound(C, pick('hyperstation/sound/voice/emotes/bat_c1.ogg', 'hyperstation/sound/voice/emotes/bat_c2.ogg', 'hyperstation/sound/voice/emotes/bat_c3.ogg',\
|
||||
'hyperstation/sound/voice/emotes/bat_c4.ogg', 'hyperstation/sound/voice/emotes/bat_c5.ogg',\
|
||||
'hyperstation/sound/voice/emotes/bat_c6.ogg', 'hyperstation/sound/voice/emotes/bat_c7.ogg', 'hyperstation/sound/voice/emotes/bat_c8.ogg',\
|
||||
'hyperstation/sound/voice/emotes/bat_c9.ogg'), 50, 1)
|
||||
*/
|
||||
//End of the random emotes I found in mob/living
|
||||
|
||||
|
||||
//Rewrites of the above start.
|
||||
/datum/emote/living/carbon/racc
|
||||
key = "racc_chitter"
|
||||
key_third_person = "raccchitters"
|
||||
message = "chitters."
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
/datum/emote/living/carbon/racc/get_sound()
|
||||
return pick('hyperstation/sound/voice/emotes/racc_chitter_1.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_2.ogg',\
|
||||
'hyperstation/sound/voice/emotes/racc_chitter_3.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_4.ogg', \
|
||||
'hyperstation/sound/voice/emotes/racc_chitter_5.ogg','hyperstation/sound/voice/emotes/racc_chitter_6.ogg', \
|
||||
'hyperstation/sound/voice/emotes/racc_chitter_7.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_8.ogg')
|
||||
|
||||
/datum/emote/living/carbon/bat
|
||||
key = "bat_chitter"
|
||||
key_third_person = "bat_chitters"
|
||||
message = "chitters."
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
/datum/emote/living/carbon/bat/get_sound()
|
||||
return pick('hyperstation/sound/voice/emotes/bat_c1.ogg', 'hyperstation/sound/voice/emotes/bat_c2.ogg', \
|
||||
'hyperstation/sound/voice/emotes/bat_c3.ogg', 'hyperstation/sound/voice/emotes/bat_c4.ogg', \
|
||||
'hyperstation/sound/voice/emotes/bat_c5.ogg','hyperstation/sound/voice/emotes/bat_c6.ogg', \
|
||||
'hyperstation/sound/voice/emotes/bat_c7.ogg', 'hyperstation/sound/voice/emotes/bat_c8.ogg',\
|
||||
'hyperstation/sound/voice/emotes/bat_c9.ogg')
|
||||
|
||||
//Rewrites of the above end.
|
||||
|
||||
//Ported from Vorestation
|
||||
/datum/emote/living/carbon/teshsqueak
|
||||
key = "teshsurprise" //Originally, It was just "surprised" but I dont think that's very telling of a teshari emote.
|
||||
key_third_person = "teshsurprised"
|
||||
message = "chirps in surprise!"
|
||||
message_param = "chirps in surprise at %t!"
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
sound = 'GainStation13/sound/voice/teshari/teshsqueak.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio.
|
||||
|
||||
/datum/emote/living/carbon/teshchirp
|
||||
key = "tchirp"
|
||||
key_third_person = "tchirps"
|
||||
message = "chirps!"
|
||||
message_param = "chirps at %t!"
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
sound = 'GainStation13/sound/voice/teshari/teshchirp.ogg' // Copyright Sampling+ 1.0 Incarnidine (freesound.org) for the source audio.
|
||||
|
||||
/datum/emote/living/carbon/teshtrill
|
||||
key = "trill"
|
||||
key_third_person = "trills"
|
||||
message = "trills."
|
||||
message_param = "trills at %t."
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
sound = 'GainStation13/sound/voice/teshari/teshtrill.ogg' // Copyright CC BY-NC 3.0 Arnaud Coutancier (freesound.org) for the source audio.
|
||||
|
||||
/datum/emote/living/sneeze/teshsneeze //Replace this with a modular species/tongue based sneeze system later. Also piggybacking on normal sneezes
|
||||
key = "teshsneeze"
|
||||
key_third_person = "teshsneezes"
|
||||
message = "sneezes."
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
/datum/emote/living/sneeze/teshsneeze/get_sound()
|
||||
return pick('GainStation13/sound/voice/teshari/tesharisneeze.ogg', 'GainStation13/sound/voice/teshari/tesharisneezeb.ogg')
|
||||
|
||||
/datum/emote/living/cough/teshcough //Same as above. Replace with a modular system later.
|
||||
key = "teshcough"
|
||||
key_third_person = "teshcoughs"
|
||||
message = "coughs."
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
/datum/emote/living/cough/teshcough/get_sound()
|
||||
return pick('GainStation13/sound/voice/teshari/tesharicougha.ogg', 'GainStation13/sound/voice/teshari/tesharicoughb.ogg')
|
||||
|
||||
/datum/emote/living/carbon/teshscream
|
||||
key = "teshscream"
|
||||
key_third_person = "teshscreams"
|
||||
message = "screams!"
|
||||
message_param = "screams at %t!"
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
sound = 'GainStation13/sound/voice/teshari/teshscream.ogg'
|
||||
|
||||
/datum/emote/living/prbt
|
||||
key = "prbt"
|
||||
key_third_person = "prbts"
|
||||
message = "prbts."
|
||||
message_param = "prbts at %t."
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
sound = 'GainStation13/sound/voice/emotes/prbt.ogg'
|
||||
|
||||
/datum/emote/living/mlem
|
||||
key = "mlem"
|
||||
key_third_person = "mlems"
|
||||
message = "mlems their tongue up over their nose. Mlem."
|
||||
|
||||
/datum/emote/living/blep
|
||||
key = "blep"
|
||||
key_third_person = "bleps"
|
||||
message = "bleps their tongue out. Blep."
|
||||
|
||||
/datum/emote/living/teppi
|
||||
key = "gyoh"
|
||||
key_third_person = "gyohs"
|
||||
message = "gyohs"
|
||||
var/bigsound = list('GainStation13/sound/voice/teppi/gyooh1.ogg', 'GainStation13/sound/voice/teppi/gyooh2.ogg', \
|
||||
'GainStation13/sound/voice/teppi/gyooh3.ogg', 'GainStation13/sound/voice/teppi/gyooh4.ogg', \
|
||||
'GainStation13/sound/voice/teppi/gyooh5.ogg', 'GainStation13/sound/voice/teppi/gyooh6.ogg')
|
||||
var/smolsound = list('GainStation13/sound/voice/teppi/whine1.ogg', 'GainStation13/sound/voice/teppi/whine2.ogg')
|
||||
|
||||
/datum/emote/living/teppi/run_emote(mob/living/user, params)
|
||||
/* //If we port teppi later, Enable this.
|
||||
if(istype(user, /mob/living/simple_mob/vore/alienanimals/teppi))
|
||||
if(istype(user, /mob/living/simple_mob/vore/alienanimals/teppi/baby))
|
||||
sound = pick(smolsound)
|
||||
else
|
||||
sound = pick(bigsound)
|
||||
return ..()
|
||||
*/
|
||||
if(user.size_multiplier >= 1.5)
|
||||
sound = pick(bigsound)
|
||||
else
|
||||
sound = pick(smolsound)
|
||||
. = ..()
|
||||
|
||||
/datum/emote/living/teppi/rumble
|
||||
key = "rumble"
|
||||
key_third_person = "rumbles"
|
||||
message = "rumbles contentedly."
|
||||
sound = 'GainStation13/sound/voice/teppi/cute_rumble.ogg'
|
||||
bigsound = list('GainStation13/sound/voice/teppi/rumble.ogg')
|
||||
smolsound = list('GainStation13/sound/voice/teppi/cute_rumble.ogg')
|
||||
|
||||
//Vorestation ports end.
|
||||
|
||||
//Ported from Chompstation
|
||||
/datum/emote/living/wawa
|
||||
key = "wawa"
|
||||
key_third_person = "wawas"
|
||||
message = "wawas."
|
||||
message_param = "wawas at %t."
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
sound = 'GainStation13/sound/voice/emotes/wawa.ogg'
|
||||
|
||||
//Chompstation ports end.
|
||||
@@ -0,0 +1,16 @@
|
||||
/mob/living/proc/reduce_fullness(amount, notify = TRUE) // fullness_amount should be between 5 and 20 for balance and below 80 for functionality
|
||||
if(!ishuman(src))
|
||||
return
|
||||
|
||||
if(fullness >= FULLNESS_LEVEL_BLOATED && fullness_reducion_timer + FULLNESS_REDUCTION_COOLDOWN < world.time)
|
||||
|
||||
fullness -= amount // Remove Fullness
|
||||
|
||||
if(!notify)
|
||||
return
|
||||
|
||||
if(amount <= 5)
|
||||
to_chat(src, "You felt that make some space")
|
||||
if(amount > 5)
|
||||
to_chat(src, "You felt that make a lot of space")
|
||||
|
||||
@@ -0,0 +1,609 @@
|
||||
//nutribot
|
||||
//nutribot PATHFINDING
|
||||
//nutribot ASSEMBLY
|
||||
#define NUTRIBOT_PANIC_NONE 0
|
||||
#define NUTRIBOT_PANIC_LOW 15
|
||||
#define NUTRIBOT_PANIC_MED 35
|
||||
#define NUTRIBOT_PANIC_HIGH 55
|
||||
#define NUTRIBOT_PANIC_FUCK 70
|
||||
#define NUTRIBOT_PANIC_ENDING 90
|
||||
#define NUTRIBOT_PANIC_END 100
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot
|
||||
name = "\improper Nutribot"
|
||||
desc = "A little nutritional robot. He looks somewhat underwhelmed."
|
||||
icon = 'GainStation13/icons/mob/nutribot.dmi'
|
||||
icon_state = "nutribot0"
|
||||
density = FALSE
|
||||
anchored = FALSE
|
||||
health = 20
|
||||
maxHealth = 20
|
||||
pass_flags = PASSMOB
|
||||
|
||||
status_flags = (CANPUSH | CANSTUN)
|
||||
|
||||
radio_key = /obj/item/encryptionkey/headset_med
|
||||
radio_channel = RADIO_CHANNEL_SERVICE
|
||||
|
||||
bot_type = MED_BOT
|
||||
model = "Nutribot"
|
||||
bot_core_type = /obj/machinery/bot_core/nutribot
|
||||
window_id = "auto_nutrition"
|
||||
window_name = "Automatic Nutritional Unit v1.1"
|
||||
data_hud_type = DATA_HUD_MEDICAL_ADVANCED
|
||||
path_image_color = "#DDDDFF"
|
||||
|
||||
var/obj/item/reagent_containers/glass/reagent_glass = null //Can be set to draw from this for reagents.
|
||||
var/skin = null //Set to "tox", "ointment" or "o2" for the other two firstaid kits.
|
||||
var/mob/living/carbon/patient = null
|
||||
var/mob/living/carbon/oldpatient = null
|
||||
var/oldloc = null
|
||||
var/last_found = 0
|
||||
var/last_newpatient_speak = 0 //Don't spam the "HEY I'M COMING" messages
|
||||
var/injection_amount = 15 //How much reagent do we inject at a time?
|
||||
var/feed_threshold = 200 // The weight that people should be fed to!
|
||||
var/use_beaker = 0 //Use reagents in beaker instead of default treatment agents.
|
||||
var/declare_cooldown = 0 //Prevents spam of critical patient alerts.
|
||||
var/stationary_mode = 0 //If enabled, the Nutribot will not move automatically.
|
||||
//Setting which reagents to use to treat what by default. By id.
|
||||
var/treatment_thin = /datum/reagent/consumable/nutriment
|
||||
var/treatment_thirsty = /datum/reagent/water
|
||||
var/hunger_check = NUTRITION_LEVEL_HUNGRY
|
||||
var/shut_up = 0 //self explanatory :)
|
||||
|
||||
//How panicked we are about being tipped over (why would you do this?)
|
||||
var/tipped_status = NUTRIBOT_PANIC_NONE
|
||||
//The name we got when we were tipped
|
||||
var/tipper_name
|
||||
//The last time we were tipped/righted and said a voice line, to avoid spam
|
||||
var/last_tipping_action_voice = 0
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/update_icon()
|
||||
cut_overlays()
|
||||
if(!on)
|
||||
icon_state = "nutribot0"
|
||||
return
|
||||
if(IsStun())
|
||||
icon_state = "nutribota"
|
||||
return
|
||||
if(mode == BOT_HEALING)
|
||||
icon_state = "nutribots[stationary_mode]"
|
||||
return
|
||||
else if(stationary_mode) //Bot has yellow light to indicate stationary mode.
|
||||
icon_state = "nutribot2"
|
||||
else
|
||||
icon_state = "nutribot1"
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/Initialize(mapload, new_skin)
|
||||
. = ..()
|
||||
var/datum/job/cook/J = new /datum/job/cook
|
||||
access_card.access += J.get_access()
|
||||
prev_access = access_card.access
|
||||
qdel(J)
|
||||
skin = new_skin
|
||||
update_icon()
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/update_canmove()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/bot_reset()
|
||||
..()
|
||||
patient = null
|
||||
oldpatient = null
|
||||
oldloc = null
|
||||
last_found = world.time
|
||||
declare_cooldown = 0
|
||||
update_icon()
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/proc/soft_reset() //Allows the Nutribot to still actively perform its medical duties without being completely halted as a hard reset does.
|
||||
path = list()
|
||||
patient = null
|
||||
mode = BOT_IDLE
|
||||
last_found = world.time
|
||||
update_icon()
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/set_custom_texts()
|
||||
|
||||
text_hack = "You corrupt [name]'s reagent processor circuits."
|
||||
text_dehack = "You reset [name]'s reagent processor circuits."
|
||||
text_dehack_fail = "[name] seems damaged and does not respond to reprogramming!"
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/attack_paw(mob/user)
|
||||
return attack_hand(user)
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/get_controls(mob/user)
|
||||
var/dat
|
||||
dat += hack(user)
|
||||
dat += showpai(user)
|
||||
dat += "<TT><B>Nutritional Unit Controls v1.1</B></TT><BR><BR>"
|
||||
dat += "Status: <A href='?src=[REF(src)];power=1'>[on ? "On" : "Off"]</A><BR>"
|
||||
dat += "Maintenance panel panel is [open ? "opened" : "closed"]<BR>"
|
||||
dat += "Beaker: "
|
||||
if(reagent_glass)
|
||||
dat += "<A href='?src=[REF(src)];eject=1'>Loaded \[[reagent_glass.reagents.total_volume]/[reagent_glass.reagents.maximum_volume]\]</a>"
|
||||
else
|
||||
dat += "None Loaded"
|
||||
dat += "<br>Behaviour controls are [locked ? "locked" : "unlocked"]<hr>"
|
||||
if(!locked || issilicon(user) || IsAdminGhost(user))
|
||||
|
||||
dat += "<TT>Feed Amount: "
|
||||
dat += "<a href='?src=[REF(src)];adj_inject=-5'>-</a> "
|
||||
dat += "[injection_amount] "
|
||||
dat += "<a href='?src=[REF(src)];adj_inject=5'>+</a> "
|
||||
dat += "</TT><br>"
|
||||
|
||||
dat += "Reagent Source: "
|
||||
dat += "<a href='?src=[REF(src)];use_beaker=1'>[use_beaker ? "Loaded Beaker (When available)" : "Internal Synthesizer"]</a><br>"
|
||||
|
||||
dat += "Hunger Check: "
|
||||
dat += "<a href='?src=[REF(src)];hunger_check=1'>[(hunger_check==NUTRITION_LEVEL_HUNGRY) ? "Yes" : "No"]</a><br>"
|
||||
|
||||
dat += "<TT>Maximum BFI: "
|
||||
dat += "[feed_threshold ? feed_threshold : "???"] "
|
||||
dat += "<br>"
|
||||
dat += "Disable Maximum BFI: <a href='?src=[REF(src)];feed_threshold=1'>["Disable"]</a><br> "
|
||||
dat += "<a href='?src=[REF(src)];feed_threshold=-100'>-</a> "
|
||||
dat += "<a href='?src=[REF(src)];feed_threshold=100'>+</a> "
|
||||
dat += "</TT><br>"
|
||||
|
||||
dat += "The speaker switch is [shut_up ? "off" : "on"]. <a href='?src=[REF(src)];togglevoice=[1]'>Toggle</a><br>"
|
||||
dat += "Patrol Station: <a href='?src=[REF(src)];operation=patrol'>[auto_patrol ? "Yes" : "No"]</a><br>"
|
||||
dat += "Stationary Mode: <a href='?src=[REF(src)];stationary=1'>[stationary_mode ? "Yes" : "No"]</a><br>"
|
||||
|
||||
return dat
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/Topic(href, href_list)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
else if(href_list["adj_inject"])
|
||||
var/adjust_num = text2num(href_list["adj_inject"])
|
||||
injection_amount += adjust_num
|
||||
if(injection_amount < 5)
|
||||
injection_amount = 5
|
||||
if(injection_amount > 15)
|
||||
injection_amount = 15
|
||||
|
||||
else if(href_list["use_beaker"])
|
||||
use_beaker = !use_beaker
|
||||
|
||||
else if(href_list["eject"] && (!isnull(reagent_glass)))
|
||||
reagent_glass.forceMove(drop_location())
|
||||
reagent_glass = null
|
||||
|
||||
else if(href_list["togglevoice"])
|
||||
shut_up = !shut_up
|
||||
|
||||
else if(href_list["stationary"])
|
||||
stationary_mode = !stationary_mode
|
||||
path = list()
|
||||
update_icon()
|
||||
|
||||
else if(href_list["hunger_check"])
|
||||
hunger_check = ((hunger_check==NUTRITION_LEVEL_HUNGRY) ? NUTRITION_LEVEL_FULL : NUTRITION_LEVEL_HUNGRY)
|
||||
|
||||
else if(href_list["feed_threshold"])
|
||||
var/adjust_num = text2num(href_list["feed_threshold"])
|
||||
feed_threshold += adjust_num
|
||||
if(adjust_num == 1)
|
||||
feed_threshold = 0
|
||||
if(feed_threshold < 0)
|
||||
feed_threshold = 0
|
||||
|
||||
update_controls()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/reagent_containers/glass))
|
||||
. = 1 //no afterattack
|
||||
if(locked)
|
||||
to_chat(user, "<span class='warning'>You cannot insert a beaker because the panel is locked!</span>")
|
||||
return
|
||||
if(!isnull(reagent_glass))
|
||||
to_chat(user, "<span class='warning'>There is already a beaker loaded!</span>")
|
||||
return
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
|
||||
reagent_glass = W
|
||||
to_chat(user, "<span class='notice'>You insert [W].</span>")
|
||||
show_controls(user)
|
||||
|
||||
else
|
||||
var/current_health = health
|
||||
..()
|
||||
if(health < current_health) //if nutribot took some damage
|
||||
step_to(src, (get_step_away(src,user)))
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/emag_act(mob/user)
|
||||
..()
|
||||
if(emagged == 2)
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>You short out [src]'s reagent synthesis circuits.</span>")
|
||||
audible_message("<span class='danger'>[src] buzzes oddly!</span>")
|
||||
flick("nutribot_spark", src)
|
||||
playsound(src, "sparks", 75, 1)
|
||||
if(user)
|
||||
oldpatient = user
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/process_scan(mob/living/carbon/human/H)
|
||||
if(H.stat == DEAD)
|
||||
return
|
||||
|
||||
if((H == oldpatient) && (world.time < last_found + 200))
|
||||
return
|
||||
|
||||
if(assess_patient(H))
|
||||
last_found = world.time
|
||||
if((last_newpatient_speak + 300) < world.time) //Don't spam these messages!
|
||||
var/list/messagevoice = list("Hey, [H.name]! Hold on, I'm coming." = 'sound/voice/medbot/coming.ogg',"Wait [H.name]! I want to help!" = 'sound/voice/medbot/help.ogg')
|
||||
var/message = pick(messagevoice)
|
||||
if(prob(2) && ISINRANGE_EX(H.getFireLoss(), 0, 20))
|
||||
message = "Notices your minor burns*OwO what's this?"
|
||||
messagevoice[message] = 'sound/voice/medbot/owo.ogg'
|
||||
speak(message)
|
||||
playsound(loc, messagevoice[message], 50, 0)
|
||||
last_newpatient_speak = world.time
|
||||
return H
|
||||
else
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/proc/tip_over(mob/user)
|
||||
canmove = 0
|
||||
//mobility_flags &= ~MOBILITY_MOVE
|
||||
playsound(src, 'sound/machines/warning-buzzer.ogg', 50)
|
||||
user.visible_message("<span class='danger'>[user] tips over [src]!</span>", "<span class='danger'>You tip [src] over!</span>")
|
||||
mode = BOT_TIPPED
|
||||
var/matrix/mat = transform
|
||||
transform = mat.Turn(180)
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/proc/set_right(mob/user)
|
||||
canmove = 1
|
||||
//mobility_flags &= MOBILITY_MOVE
|
||||
var/list/messagevoice
|
||||
if(user)
|
||||
user.visible_message("<span class='notice'>[user] sets [src] right-side up!</span>", "<span class='green'>You set [src] right-side up!</span>")
|
||||
if(user.name == tipper_name)
|
||||
messagevoice = list("I forgive you." = 'sound/voice/medbot/forgive.ogg')
|
||||
else
|
||||
messagevoice = list("Thank you!" = 'sound/voice/medbot/thank_you.ogg', "You are a good person." = 'sound/voice/medbot/youre_good.ogg')
|
||||
else
|
||||
visible_message("<span class='notice'>[src] manages to writhe wiggle enough to right itself.</span>")
|
||||
messagevoice = list("Fuck you." = 'sound/voice/medbot/fuck_you.ogg', "Your behavior has been reported, have a nice day." = 'sound/voice/medbot/reported.ogg')
|
||||
|
||||
tipper_name = null
|
||||
if(world.time > last_tipping_action_voice + 15 SECONDS)
|
||||
last_tipping_action_voice = world.time
|
||||
var/message = pick(messagevoice)
|
||||
speak(message)
|
||||
playsound(src, messagevoice[message], 70)
|
||||
tipped_status = NUTRIBOT_PANIC_NONE
|
||||
mode = BOT_IDLE
|
||||
transform = matrix()
|
||||
|
||||
// if someone tipped us over, check whether we should ask for help or just right ourselves eventually
|
||||
/mob/living/simple_animal/bot/nutribot/proc/handle_panic()
|
||||
tipped_status++
|
||||
var/list/messagevoice
|
||||
switch(tipped_status)
|
||||
if(NUTRIBOT_PANIC_LOW)
|
||||
messagevoice = list("I require assistance." = 'sound/voice/medbot/i_require_asst.ogg')
|
||||
if(NUTRIBOT_PANIC_MED)
|
||||
messagevoice = list("Please put me back." = 'sound/voice/medbot/please_put_me_back.ogg')
|
||||
if(NUTRIBOT_PANIC_HIGH)
|
||||
messagevoice = list("Please, I am scared!" = 'sound/voice/medbot/please_im_scared.ogg')
|
||||
if(NUTRIBOT_PANIC_FUCK)
|
||||
messagevoice = list("I don't like this, I need help!" = 'sound/voice/medbot/dont_like.ogg', "This hurts, my pain is real!" = 'sound/voice/medbot/pain_is_real.ogg')
|
||||
if(NUTRIBOT_PANIC_ENDING)
|
||||
messagevoice = list("Is this the end?" = 'sound/voice/medbot/is_this_the_end.ogg', "Nooo!" = 'sound/voice/medbot/nooo.ogg')
|
||||
if(NUTRIBOT_PANIC_END)
|
||||
speak("PSYCH ALERT: Crewmember [tipper_name] recorded displaying antisocial tendencies torturing bots in [get_area(src)]. Please schedule psych evaluation.", radio_channel)
|
||||
set_right() // strong independent nutribot
|
||||
|
||||
if(prob(tipped_status))
|
||||
do_jitter_animation(tipped_status * 0.1)
|
||||
|
||||
if(messagevoice)
|
||||
var/message = pick(messagevoice)
|
||||
speak(message)
|
||||
playsound(src, messagevoice[message], 70)
|
||||
else if(prob(tipped_status * 0.2))
|
||||
playsound(src, 'sound/machines/warning-buzzer.ogg', 30, extrarange=-2)
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/examine(mob/user)
|
||||
. = ..()
|
||||
if(tipped_status == NUTRIBOT_PANIC_NONE)
|
||||
return
|
||||
|
||||
switch(tipped_status)
|
||||
if(NUTRIBOT_PANIC_NONE to NUTRIBOT_PANIC_LOW)
|
||||
. += "It appears to be tipped over, and is quietly waiting for someone to set it right."
|
||||
if(NUTRIBOT_PANIC_LOW to NUTRIBOT_PANIC_MED)
|
||||
. += "It is tipped over and requesting help."
|
||||
if(NUTRIBOT_PANIC_MED to NUTRIBOT_PANIC_HIGH)
|
||||
. += "They are tipped over and appear visibly distressed." // now we humanize the nutribot as a they, not an it
|
||||
if(NUTRIBOT_PANIC_HIGH to NUTRIBOT_PANIC_FUCK)
|
||||
. += "<span class='warning'>They are tipped over and visibly panicking!</span>"
|
||||
if(NUTRIBOT_PANIC_FUCK to INFINITY)
|
||||
. += "<span class='warning'><b>They are freaking out from being tipped over!</b></span>"
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/handle_automated_action()
|
||||
if(!..())
|
||||
return
|
||||
|
||||
if(mode == BOT_TIPPED)
|
||||
handle_panic()
|
||||
return
|
||||
|
||||
if(mode == BOT_HEALING)
|
||||
return
|
||||
|
||||
if(IsStun())
|
||||
oldpatient = patient
|
||||
patient = null
|
||||
mode = BOT_IDLE
|
||||
return
|
||||
|
||||
if(frustration > 8)
|
||||
oldpatient = patient
|
||||
soft_reset()
|
||||
|
||||
if(QDELETED(patient))
|
||||
if(!shut_up && prob(1))
|
||||
if(emagged && prob(30))
|
||||
var/list/i_need_scissors = list('sound/voice/medbot/fuck_you.ogg', 'sound/voice/medbot/turn_off.ogg', 'sound/voice/medbot/im_different.ogg', 'sound/voice/medbot/close.ogg', 'sound/voice/medbot/shindemashou.ogg')
|
||||
playsound(src, pick(i_need_scissors), 70)
|
||||
else
|
||||
var/list/messagevoice = list("Radar, put a mask on!" = 'sound/voice/medbot/radar.ogg',"There's always a catch, and I'm the best there is." = 'sound/voice/medbot/catch.ogg',"I knew it, I should've been a plastic surgeon." = 'sound/voice/medbot/surgeon.ogg',"What kind of medbay is this? Everyone's dropping like flies." = 'sound/voice/medbot/flies.ogg',"Delicious!" = 'sound/voice/medbot/delicious.ogg', "Why are we still here? Just to suffer?" = 'sound/voice/medbot/why.ogg')
|
||||
var/message = pick(messagevoice)
|
||||
speak(message)
|
||||
playsound(src, messagevoice[message], 50)
|
||||
var/scan_range = (stationary_mode ? 1 : DEFAULT_SCAN_RANGE) //If in stationary mode, scan range is limited to adjacent patients.
|
||||
patient = scan(/mob/living/carbon/human, oldpatient, scan_range)
|
||||
oldpatient = patient
|
||||
|
||||
if(patient && (get_dist(src,patient) <= 1)) //Patient is next to us, begin treatment!
|
||||
if(mode != BOT_HEALING)
|
||||
mode = BOT_HEALING
|
||||
update_icon()
|
||||
frustration = 0
|
||||
medicate_patient(patient)
|
||||
return
|
||||
|
||||
//Patient has moved away from us!
|
||||
else if(patient && path.len && (get_dist(patient,path[path.len]) > 2))
|
||||
path = list()
|
||||
mode = BOT_IDLE
|
||||
last_found = world.time
|
||||
|
||||
else if(stationary_mode && patient) //Since we cannot move in this mode, ignore the patient and wait for another.
|
||||
soft_reset()
|
||||
return
|
||||
|
||||
if(patient && path.len == 0 && (get_dist(src,patient) > 1))
|
||||
path = get_path_to(src, get_turf(patient), /turf/proc/Distance_cardinal, 0, 30,id=access_card)
|
||||
mode = BOT_MOVING
|
||||
if(!path.len) //try to get closer if you can't reach the patient directly
|
||||
path = get_path_to(src, get_turf(patient), /turf/proc/Distance_cardinal, 0, 30,1,id=access_card)
|
||||
if(!path.len) //Do not chase a patient we cannot reach.
|
||||
soft_reset()
|
||||
|
||||
if(path.len > 0 && patient)
|
||||
if(!bot_move(path[path.len]))
|
||||
oldpatient = patient
|
||||
soft_reset()
|
||||
return
|
||||
|
||||
if(path.len > 8 && patient)
|
||||
frustration++
|
||||
|
||||
if(auto_patrol && !stationary_mode && !patient)
|
||||
if(mode == BOT_IDLE || mode == BOT_START_PATROL)
|
||||
start_patrol()
|
||||
|
||||
if(mode == BOT_PATROL)
|
||||
bot_patrol()
|
||||
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/proc/assess_patient(mob/living/carbon/C)
|
||||
//Time to see if they need medical help!
|
||||
if(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_FAKEDEATH)))
|
||||
return FALSE //welp too late for them!
|
||||
|
||||
if(!(loc == C.loc) && !(isturf(C.loc) && isturf(loc)))
|
||||
return FALSE
|
||||
|
||||
if(C.suiciding)
|
||||
return FALSE //Kevorkian school of robotic medical assistants.
|
||||
|
||||
if(!C?.client?.prefs.bot_feeding)
|
||||
return FALSE
|
||||
|
||||
if(emagged == 2) //Everyone needs our medicine. (Our medicine is corn oil)
|
||||
return TRUE
|
||||
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if (H.wear_suit && H.head && istype(H.wear_suit, /obj/item/clothing) && istype(H.head, /obj/item/clothing))
|
||||
var/obj/item/clothing/CS = H.wear_suit
|
||||
var/obj/item/clothing/CH = H.head
|
||||
if (CS.clothing_flags & CH.clothing_flags & THICKMATERIAL)
|
||||
return FALSE // Skip over them if they have no exposed flesh.
|
||||
|
||||
//if(declare_crit && C.health <= 0) //Critical condition! Call for help!
|
||||
//declare(C)
|
||||
|
||||
//If they're injured, we're using a beaker, and don't have one of our WONDERCHEMS.
|
||||
if((reagent_glass) && (use_beaker) && (C.nutrition <= hunger_check) && ((C.fatness <= feed_threshold) || (feed_threshold == 0)))
|
||||
for(var/A in reagent_glass.reagents.reagent_list)
|
||||
var/datum/reagent/R = A
|
||||
if(!C.reagents.has_reagent(R.type))
|
||||
return TRUE
|
||||
|
||||
//They're injured enough for it!
|
||||
|
||||
//nutrition check
|
||||
if((C.nutrition <= hunger_check) && ((C.fatness <= feed_threshold) || (feed_threshold == 0)) && (!C.reagents.has_reagent(treatment_thin)))
|
||||
return TRUE //If they're already medicated don't bother!
|
||||
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/attack_hand(mob/living/carbon/human/H)
|
||||
if(H.a_intent == INTENT_DISARM && mode != BOT_TIPPED)
|
||||
H.visible_message("<span class='danger'>[H] begins tipping over [src].</span>", "<span class='warning'>You begin tipping over [src]...</span>")
|
||||
|
||||
if(world.time > last_tipping_action_voice + 15 SECONDS)
|
||||
last_tipping_action_voice = world.time // message for tipping happens when we start interacting, message for righting comes after finishing
|
||||
var/list/messagevoice = list("Hey, wait..." = 'sound/voice/medbot/hey_wait.ogg',"Please don't..." = 'sound/voice/medbot/please_dont.ogg',"I trusted you..." = 'sound/voice/medbot/i_trusted_you.ogg', "Nooo..." = 'sound/voice/medbot/nooo.ogg', "Oh fuck-" = 'sound/voice/medbot/oh_fuck.ogg')
|
||||
var/message = pick(messagevoice)
|
||||
speak(message)
|
||||
playsound(src, messagevoice[message], 70, FALSE)
|
||||
|
||||
if(do_after(H, 3 SECONDS, target=src))
|
||||
tip_over(H)
|
||||
|
||||
else if(H.a_intent == INTENT_HELP && mode == BOT_TIPPED)
|
||||
H.visible_message("<span class='notice'>[H] begins righting [src].</span>", "<span class='notice'>You begin righting [src]...</span>")
|
||||
if(do_after(H, 3 SECONDS, target=src))
|
||||
set_right(H)
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/UnarmedAttack(atom/A)
|
||||
if(iscarbon(A))
|
||||
var/mob/living/carbon/C = A
|
||||
patient = C
|
||||
mode = BOT_HEALING
|
||||
update_icon()
|
||||
medicate_patient(C)
|
||||
update_icon()
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/examinate(atom/A as mob|obj|turf in view())
|
||||
..()
|
||||
if(!is_blind(src))
|
||||
chemscan(src, A)
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/proc/medicate_patient(mob/living/carbon/C)
|
||||
if(!on)
|
||||
return
|
||||
|
||||
if(!istype(C))
|
||||
oldpatient = patient
|
||||
soft_reset()
|
||||
return
|
||||
|
||||
if(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_FAKEDEATH)))
|
||||
var/list/messagevoice = list("No! Stay with me!" = 'sound/voice/medbot/no.ogg',"Live, damnit! LIVE!" = 'sound/voice/medbot/live.ogg',"I...I've never lost a patient before. Not today, I mean." = 'sound/voice/medbot/lost.ogg')
|
||||
var/message = pick(messagevoice)
|
||||
speak(message)
|
||||
playsound(loc, messagevoice[message], 50, 0)
|
||||
oldpatient = patient
|
||||
soft_reset()
|
||||
return
|
||||
|
||||
var/reagent_id = null
|
||||
|
||||
if(emagged == 2) //Emagged! Time to poison everybody.
|
||||
reagent_id = /datum/reagent/consumable/cornoil //evil fucking check for a string as a reagent this shit is evil. its supposed to inject corn oil AND filzulphite but ill handle that later
|
||||
|
||||
else
|
||||
|
||||
if(!reagent_id && ((feed_threshold == 0) || (C.fatness <= feed_threshold)) && (C.nutrition <= hunger_check))
|
||||
if(!C.reagents.has_reagent(treatment_thin))
|
||||
reagent_id = treatment_thin
|
||||
|
||||
//If the patient is injured but doesn't have our special reagent in them then we should give it to them first
|
||||
if(reagent_id && use_beaker && reagent_glass && reagent_glass.reagents.total_volume)
|
||||
for(var/A in reagent_glass.reagents.reagent_list)
|
||||
var/datum/reagent/R = A
|
||||
if(!C.reagents.has_reagent(R.type))
|
||||
reagent_id = "internal_beaker"
|
||||
break
|
||||
|
||||
if(!reagent_id) //If they don't need any of that they're probably cured!
|
||||
if((C.nutrition >= hunger_check) || (C.fatness >= feed_threshold))
|
||||
to_chat(src, "<span class='notice'>[C] is full, or fat! Your programming prevents you from feeding anyone who is over the maximum weight, or doesn't need food!</span>")
|
||||
var/list/messagevoice = list("All patched up!" = 'sound/voice/medbot/patchedup.ogg',"An apple a day keeps me away." = 'sound/voice/medbot/apple.ogg',"Feel better soon!" = 'sound/voice/medbot/feelbetter.ogg')
|
||||
var/message = pick(messagevoice)
|
||||
speak(message)
|
||||
playsound(loc, messagevoice[message], 50, 0)
|
||||
bot_reset()
|
||||
return
|
||||
else
|
||||
if(!emagged && check_overdose(patient,reagent_id,injection_amount))
|
||||
soft_reset()
|
||||
return
|
||||
C.visible_message("<span class='danger'>[src] is trying to feed [patient]!</span>", \
|
||||
"<span class='userdanger'>[src] is trying to feed you!</span>")
|
||||
|
||||
var/failed = FALSE
|
||||
if(do_mob(src, patient, 30)) //Is C == patient? This is so confusing
|
||||
if((get_dist(src, patient) <= 1) && (on) && assess_patient(patient))
|
||||
if(reagent_id == "internal_beaker")
|
||||
if(use_beaker && reagent_glass && reagent_glass.reagents.total_volume)
|
||||
var/fraction = min(injection_amount/reagent_glass.reagents.total_volume, 1)
|
||||
reagent_glass.reagents.reaction(patient, INJECT, fraction)
|
||||
reagent_glass.reagents.trans_to(patient,injection_amount) //Inject from beaker instead.
|
||||
else
|
||||
patient.reagents.add_reagent(reagent_id,injection_amount)
|
||||
C.visible_message("<span class='danger'>[src] feeds [patient] with its tube!</span>", \
|
||||
"<span class='userdanger'>[src] feeds you with its tube!</span>")
|
||||
else
|
||||
failed = TRUE
|
||||
else
|
||||
failed = TRUE
|
||||
|
||||
if(failed)
|
||||
visible_message("[src] retracts its tube.")
|
||||
update_icon()
|
||||
soft_reset()
|
||||
return
|
||||
|
||||
reagent_id = null
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/proc/check_overdose(mob/living/carbon/patient,reagent_id,injection_amount)
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[reagent_id]
|
||||
if(!R.overdose_threshold) //Some chems do not have an OD threshold
|
||||
return FALSE
|
||||
var/current_volume = patient.reagents.get_reagent_amount(reagent_id)
|
||||
if(current_volume + injection_amount > R.overdose_threshold)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/bot/nutribot/explode()
|
||||
on = FALSE
|
||||
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
|
||||
var/atom/Tsec = drop_location()
|
||||
|
||||
new /obj/item/stack/sheet/cardboard(Tsec)
|
||||
new /obj/item/assembly/prox_sensor(Tsec)
|
||||
new /obj/item/stack/sheet/mineral/calorite(Tsec)
|
||||
|
||||
if(reagent_glass)
|
||||
drop_part(reagent_glass, Tsec)
|
||||
|
||||
if(prob(50))
|
||||
drop_part(robot_arm, Tsec)
|
||||
|
||||
if(emagged && prob(25))
|
||||
playsound(loc, 'sound/voice/medbot/insult.ogg', 50, 0)
|
||||
|
||||
do_sparks(3, TRUE, src)
|
||||
..()
|
||||
|
||||
/obj/machinery/bot_core/nutribot
|
||||
req_one_access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_ROBOTICS)
|
||||
|
||||
#undef NUTRIBOT_PANIC_NONE
|
||||
#undef NUTRIBOT_PANIC_LOW
|
||||
#undef NUTRIBOT_PANIC_MED
|
||||
#undef NUTRIBOT_PANIC_HIGH
|
||||
#undef NUTRIBOT_PANIC_FUCK
|
||||
#undef NUTRIBOT_PANIC_ENDING
|
||||
#undef NUTRIBOT_PANIC_END
|
||||
@@ -0,0 +1,423 @@
|
||||
/datum/species/proc/handle_fatness_trait(mob/living/carbon/human/H, trait, trait_lose, trait_gain, fatness_lose, fatness_gain, chat_lose, chat_gain)
|
||||
if(H.fatness < fatness_lose)
|
||||
if (chat_lose)
|
||||
to_chat(H, chat_lose)
|
||||
if (trait)
|
||||
REMOVE_TRAIT(H, trait, OBESITY)
|
||||
if (trait_lose)
|
||||
ADD_TRAIT(H, trait_lose, OBESITY)
|
||||
update_body_size(H, -1)
|
||||
else if(H.fatness >= fatness_gain)
|
||||
if (chat_gain)
|
||||
to_chat(H, chat_gain)
|
||||
if (trait)
|
||||
REMOVE_TRAIT(H, trait, OBESITY)
|
||||
if (trait_gain)
|
||||
ADD_TRAIT(H, trait_gain, OBESITY)
|
||||
update_body_size(H, 1)
|
||||
|
||||
/datum/species/proc/handle_helplessness(mob/living/carbon/human/fatty)
|
||||
var/datum/preferences/preferences = fatty?.client?.prefs
|
||||
if(!istype(preferences))
|
||||
return FALSE
|
||||
|
||||
if(preferences.helplessness_no_movement)
|
||||
if(!HAS_TRAIT_FROM(fatty, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT))
|
||||
if(fatty.fatness >= preferences.helplessness_no_movement)
|
||||
to_chat(fatty, "<span class='warning'>You have become too fat to move anymore.</span>")
|
||||
ADD_TRAIT(fatty, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT)
|
||||
|
||||
else if(fatty.fatness < preferences.helplessness_no_movement)
|
||||
to_chat(fatty, "<span class='notice'>You have become thin enough to regain some of your mobility.</span>")
|
||||
REMOVE_TRAIT(fatty, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT)
|
||||
|
||||
else
|
||||
if(HAS_TRAIT_FROM(fatty, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(fatty, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT)
|
||||
|
||||
|
||||
if(preferences.helplessness_clumsy)
|
||||
if(!HAS_TRAIT_FROM(fatty, TRAIT_CLUMSY, HELPLESSNESS_TRAIT))
|
||||
if(fatty.fatness >= preferences.helplessness_clumsy)
|
||||
to_chat(fatty, "<span class='warning'>Your newfound weight has made it hard to manipulate objects.</span>")
|
||||
ADD_TRAIT(fatty, TRAIT_CLUMSY, HELPLESSNESS_TRAIT)
|
||||
|
||||
else if(fatty.fatness < preferences.helplessness_clumsy)
|
||||
to_chat(fatty, "<span class='notice'>You feel like you have lost enough weight to recover your dexterity.</span>")
|
||||
REMOVE_TRAIT(fatty, TRAIT_CLUMSY, HELPLESSNESS_TRAIT)
|
||||
|
||||
else
|
||||
if(HAS_TRAIT_FROM(fatty, TRAIT_CLUMSY, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(fatty, TRAIT_CLUMSY, HELPLESSNESS_TRAIT)
|
||||
|
||||
|
||||
if(preferences.helplessness_nearsighted)
|
||||
if(!HAS_TRAIT_FROM(fatty, TRAIT_NEARSIGHT, HELPLESSNESS_TRAIT))
|
||||
if(fatty.fatness >= preferences.helplessness_nearsighted)
|
||||
to_chat(fatty, "<span class='warning'>Your fat makes it difficult to see the world around you. </span>")
|
||||
fatty.become_nearsighted(HELPLESSNESS_TRAIT)
|
||||
|
||||
else if(fatty.fatness < preferences.helplessness_nearsighted)
|
||||
to_chat(fatty, "<span class='notice'>You are thin enough to see your enviornment again. </span>")
|
||||
fatty.cure_nearsighted(HELPLESSNESS_TRAIT)
|
||||
|
||||
else
|
||||
if(HAS_TRAIT_FROM(fatty, TRAIT_NEARSIGHT, HELPLESSNESS_TRAIT))
|
||||
fatty.cure_nearsighted(HELPLESSNESS_TRAIT)
|
||||
|
||||
|
||||
if(preferences.helplessness_hidden_face)
|
||||
if(!HAS_TRAIT_FROM(fatty, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT))
|
||||
if(fatty.fatness >= preferences.helplessness_hidden_face)
|
||||
to_chat(fatty, "<span class='warning'>You have gotten fat enough that your face is now unrecognizable. </span>")
|
||||
ADD_TRAIT(fatty, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT)
|
||||
|
||||
else if(fatty.fatness < preferences.helplessness_hidden_face)
|
||||
to_chat(fatty, "<span class='notice'>You have lost enough weight to allow people to now recognize your face.</span>")
|
||||
REMOVE_TRAIT(fatty, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT)
|
||||
|
||||
else
|
||||
if(HAS_TRAIT_FROM(fatty, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(fatty, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT)
|
||||
|
||||
|
||||
if(preferences.helplessness_mute)
|
||||
if(!HAS_TRAIT_FROM(fatty, TRAIT_MUTE, HELPLESSNESS_TRAIT))
|
||||
if(fatty.fatness >= preferences.helplessness_mute)
|
||||
to_chat(fatty, "<span class='warning'>Your fat makes it impossible for you to speak.</span>")
|
||||
ADD_TRAIT(fatty, TRAIT_MUTE, HELPLESSNESS_TRAIT)
|
||||
|
||||
else if(fatty.fatness < preferences.helplessness_mute)
|
||||
to_chat(fatty, "<span class='notice'>You are thin enough now to be able to speak again. </span>")
|
||||
REMOVE_TRAIT(fatty, TRAIT_MUTE, HELPLESSNESS_TRAIT)
|
||||
|
||||
else
|
||||
if(HAS_TRAIT_FROM(fatty, TRAIT_MUTE, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(fatty, TRAIT_MUTE, HELPLESSNESS_TRAIT)
|
||||
|
||||
|
||||
if(preferences.helplessness_immobile_arms)
|
||||
if(!HAS_TRAIT_FROM(fatty, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT))
|
||||
if(fatty.fatness >= preferences.helplessness_immobile_arms)
|
||||
to_chat(fatty, "<span class='warning'>Your arms are now engulfed in fat, making it impossible to move your arms. </span>")
|
||||
ADD_TRAIT(fatty, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT)
|
||||
ADD_TRAIT(fatty, TRAIT_PARALYSIS_R_ARM, HELPLESSNESS_TRAIT)
|
||||
fatty.update_disabled_bodyparts()
|
||||
|
||||
else if(fatty.fatness < preferences.helplessness_immobile_arms)
|
||||
to_chat(fatty, "<span class='notice'>You are able to move your arms again. </span>")
|
||||
REMOVE_TRAIT(fatty, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT)
|
||||
REMOVE_TRAIT(fatty, TRAIT_PARALYSIS_R_ARM, HELPLESSNESS_TRAIT)
|
||||
fatty.update_disabled_bodyparts()
|
||||
|
||||
else
|
||||
if(HAS_TRAIT_FROM(fatty, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(fatty, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT)
|
||||
REMOVE_TRAIT(fatty, TRAIT_PARALYSIS_R_ARM, HELPLESSNESS_TRAIT)
|
||||
fatty.update_disabled_bodyparts()
|
||||
|
||||
if(preferences.helplessness_clothing_jumpsuit)
|
||||
if(!HAS_TRAIT_FROM(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT))
|
||||
if(fatty.fatness >= preferences.helplessness_clothing_jumpsuit)
|
||||
ADD_TRAIT(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT)
|
||||
|
||||
var/obj/item/clothing/under/jumpsuit = fatty.w_uniform
|
||||
if(istype(jumpsuit) && !istype(jumpsuit, /obj/item/clothing/under/color/grey/modular))
|
||||
to_chat(fatty, "<span class='warning'>[jumpsuit] can no longer contain your weight!</span>")
|
||||
fatty.dropItemToGround(jumpsuit)
|
||||
|
||||
else if(fatty.fatness < preferences.helplessness_clothing_jumpsuit)
|
||||
to_chat(fatty, "<span class='notice'>You feel thin enough to put on jumpsuits now. </span>")
|
||||
REMOVE_TRAIT(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT)
|
||||
|
||||
else
|
||||
if(HAS_TRAIT_FROM(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT)
|
||||
|
||||
|
||||
if(preferences.helplessness_clothing_misc)
|
||||
if(!HAS_TRAIT_FROM(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT))
|
||||
if(fatty.fatness >= preferences.helplessness_clothing_misc)
|
||||
ADD_TRAIT(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT)
|
||||
|
||||
var/obj/item/clothing/suit/worn_suit = fatty.wear_suit
|
||||
if(istype(worn_suit))
|
||||
to_chat(fatty, "<span class='warning'>[worn_suit] can no longer contain your weight!</span>")
|
||||
fatty.dropItemToGround(worn_suit)
|
||||
|
||||
var/obj/item/clothing/gloves/worn_gloves = fatty.gloves
|
||||
if(istype(worn_gloves))
|
||||
to_chat(fatty, "<span class='warning'>[worn_gloves] can no longer contain your weight!</span>")
|
||||
fatty.dropItemToGround(worn_gloves)
|
||||
|
||||
var/obj/item/clothing/shoes/worn_shoes = fatty.shoes
|
||||
if(istype(worn_shoes))
|
||||
to_chat(fatty, "<span class='warning'>[worn_shoes] can no longer contain your weight!</span>")
|
||||
fatty.dropItemToGround(worn_shoes)
|
||||
|
||||
else if(fatty.fatness < preferences.helplessness_clothing_misc)
|
||||
to_chat(fatty, "<span class='notice'>You feel thin enough to put on suits, shoes, and gloves now. </span>")
|
||||
REMOVE_TRAIT(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT)
|
||||
|
||||
else
|
||||
if(HAS_TRAIT_FROM(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT)
|
||||
|
||||
|
||||
if(preferences.helplessness_clothing_back)
|
||||
if(!HAS_TRAIT_FROM(fatty, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT))
|
||||
if(fatty.fatness >= preferences.helplessness_clothing_back)
|
||||
ADD_TRAIT(fatty, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT)
|
||||
var/obj/item/back_item = fatty.back
|
||||
if(istype(back_item))
|
||||
to_chat(fatty, "<span class='warning'>Your weight makes it impossible for you to carry [back_item].</span>")
|
||||
fatty.dropItemToGround(back_item)
|
||||
|
||||
else if(fatty.fatness < preferences.helplessness_clothing_back)
|
||||
to_chat(fatty, "<span class='notice'>You feel thin enough to hold items on your back now. </span>")
|
||||
REMOVE_TRAIT(fatty, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT)
|
||||
|
||||
else
|
||||
if(HAS_TRAIT_FROM(fatty, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(fatty, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT)
|
||||
|
||||
|
||||
if(preferences.helplessness_no_buckle)
|
||||
if(!HAS_TRAIT_FROM(fatty, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT))
|
||||
if(fatty.fatness >= preferences.helplessness_no_buckle)
|
||||
to_chat(fatty, "<span class='warning'>You feel like you've gotten too big to fit on anything.</span>")
|
||||
ADD_TRAIT(fatty, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT)
|
||||
|
||||
else if(fatty.fatness < preferences.helplessness_no_buckle)
|
||||
to_chat(fatty, "<span class='notice'>You feel thin enough to sit on things again. </span>")
|
||||
REMOVE_TRAIT(fatty, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT)
|
||||
|
||||
else
|
||||
if(HAS_TRAIT_FROM(fatty, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT))
|
||||
REMOVE_TRAIT(fatty, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT)
|
||||
|
||||
|
||||
/datum/species/proc/handle_fatness(mob/living/carbon/human/H)
|
||||
handle_helplessness(H)
|
||||
if(HAS_TRAIT(H, TRAIT_BLOB))
|
||||
handle_fatness_trait(
|
||||
H,
|
||||
TRAIT_BLOB,
|
||||
TRAIT_IMMOBILE,
|
||||
null,
|
||||
FATNESS_LEVEL_BLOB,
|
||||
INFINITY,
|
||||
"<span class='notice'>You feel like you've regained some mobility!</span>",
|
||||
null)
|
||||
return
|
||||
if(HAS_TRAIT(H, TRAIT_IMMOBILE))
|
||||
handle_fatness_trait(
|
||||
H,
|
||||
TRAIT_IMMOBILE,
|
||||
TRAIT_BARELYMOBILE,
|
||||
TRAIT_BLOB,
|
||||
FATNESS_LEVEL_IMMOBILE,
|
||||
FATNESS_LEVEL_BLOB,
|
||||
"<span class='notice'>You feel less restrained by your fat!</span>",
|
||||
"<span class='danger'>You feel like you've become a mountain of fat!</span>")
|
||||
return
|
||||
if(HAS_TRAIT(H, TRAIT_BARELYMOBILE))
|
||||
handle_fatness_trait(
|
||||
H,
|
||||
TRAIT_BARELYMOBILE,
|
||||
TRAIT_EXTREMELYOBESE,
|
||||
TRAIT_IMMOBILE,
|
||||
FATNESS_LEVEL_BARELYMOBILE,
|
||||
FATNESS_LEVEL_IMMOBILE,
|
||||
"<span class='notice'>You feel less restrained by your fat!</span>",
|
||||
"<span class='danger'>You feel belly smush against the floor!</span>")
|
||||
return
|
||||
if(HAS_TRAIT(H, TRAIT_EXTREMELYOBESE))
|
||||
handle_fatness_trait(
|
||||
H,
|
||||
TRAIT_EXTREMELYOBESE,
|
||||
TRAIT_MORBIDLYOBESE,
|
||||
TRAIT_BARELYMOBILE,
|
||||
FATNESS_LEVEL_EXTREMELY_OBESE,
|
||||
FATNESS_LEVEL_BARELYMOBILE,
|
||||
"<span class='notice'>You feel less restrained by your fat!</span>",
|
||||
"<span class='danger'>You feel like you can barely move!</span>")
|
||||
return
|
||||
if(HAS_TRAIT(H, TRAIT_MORBIDLYOBESE))
|
||||
handle_fatness_trait(
|
||||
H,
|
||||
TRAIT_MORBIDLYOBESE,
|
||||
TRAIT_OBESE,
|
||||
TRAIT_EXTREMELYOBESE,
|
||||
FATNESS_LEVEL_MORBIDLY_OBESE,
|
||||
FATNESS_LEVEL_EXTREMELY_OBESE,
|
||||
"<span class='notice'>You feel a bit less fat!</span>",
|
||||
"<span class='danger'>You feel your belly rest heavily on your lap!</span>")
|
||||
return
|
||||
if(HAS_TRAIT(H, TRAIT_OBESE))
|
||||
handle_fatness_trait(
|
||||
H,
|
||||
TRAIT_OBESE,
|
||||
TRAIT_VERYFAT,
|
||||
TRAIT_MORBIDLYOBESE,
|
||||
FATNESS_LEVEL_OBESE,
|
||||
FATNESS_LEVEL_MORBIDLY_OBESE,
|
||||
"<span class='notice'>You feel like you've lost weight!</span>",
|
||||
"<span class='danger'>Your thighs begin to rub against each other.</span>")
|
||||
return
|
||||
if(HAS_TRAIT(H, TRAIT_VERYFAT))
|
||||
handle_fatness_trait(
|
||||
H,
|
||||
TRAIT_VERYFAT,
|
||||
TRAIT_FATTER,
|
||||
TRAIT_OBESE,
|
||||
FATNESS_LEVEL_VERYFAT,
|
||||
FATNESS_LEVEL_OBESE,
|
||||
"<span class='notice'>You feel like you've lost weight!</span>",
|
||||
"<span class='danger'>You feel like you're starting to get really heavy.</span>")
|
||||
return
|
||||
if(HAS_TRAIT(H, TRAIT_FATTER))
|
||||
handle_fatness_trait(
|
||||
H,
|
||||
TRAIT_FATTER,
|
||||
TRAIT_FAT,
|
||||
TRAIT_VERYFAT,
|
||||
FATNESS_LEVEL_FATTER,
|
||||
FATNESS_LEVEL_VERYFAT,
|
||||
"<span class='notice'>You feel like you've lost weight!</span>",
|
||||
"<span class='danger'>Your clothes creak quietly!</span>")
|
||||
return
|
||||
if(HAS_TRAIT(H, TRAIT_FAT))
|
||||
handle_fatness_trait(
|
||||
H,
|
||||
TRAIT_FAT,
|
||||
null,
|
||||
TRAIT_FATTER,
|
||||
FATNESS_LEVEL_FAT,
|
||||
FATNESS_LEVEL_FATTER,
|
||||
"<span class='notice'>You feel fit again!</span>",
|
||||
"<span class='danger'>You feel even plumper!</span>")
|
||||
else
|
||||
handle_fatness_trait(
|
||||
H,
|
||||
null,
|
||||
null,
|
||||
TRAIT_FAT,
|
||||
0,
|
||||
FATNESS_LEVEL_FAT,
|
||||
null,
|
||||
"<span class='danger'>You suddenly feel blubbery!</span>")
|
||||
|
||||
/datum/species/proc/handle_digestion(mob/living/carbon/human/H)
|
||||
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
return //hunger is for BABIES
|
||||
|
||||
handle_fatness(H) // GS13
|
||||
|
||||
// nutrition decrease and satiety
|
||||
if (H.nutrition > 0 && H.stat != DEAD && !HAS_TRAIT(H, TRAIT_NOHUNGER))
|
||||
// THEY HUNGER
|
||||
var/hunger_rate = HUNGER_FACTOR
|
||||
var/datum/component/mood/mood = H.GetComponent(/datum/component/mood)
|
||||
if(mood && mood.sanity > SANITY_DISTURBED)
|
||||
hunger_rate *= max(0.5, 1 - 0.002 * mood.sanity) //0.85 to 0.75
|
||||
|
||||
// Whether we cap off our satiety or move it towards 0
|
||||
if(H.satiety > MAX_SATIETY)
|
||||
H.satiety = MAX_SATIETY
|
||||
else if(H.satiety > 0)
|
||||
H.satiety--
|
||||
else if(H.satiety < -MAX_SATIETY)
|
||||
H.satiety = -MAX_SATIETY
|
||||
else if(H.satiety < 0)
|
||||
H.satiety++
|
||||
if(prob(round(-H.satiety/40)))
|
||||
H.Jitter(5)
|
||||
hunger_rate = 3 * HUNGER_FACTOR
|
||||
hunger_rate *= H.physiology.hunger_mod
|
||||
H.nutrition = max(0, H.nutrition - hunger_rate)
|
||||
|
||||
|
||||
if (H.nutrition > NUTRITION_LEVEL_FULL)
|
||||
// fatConversionRate is functionally useless. It seems under normal curcumstances, each tick only processes, at most, 1 nutrition anyway. reducing the value has no effect.
|
||||
var/fatConversionRate = 100 //GS13 what percentage of the excess nutrition should go to fat (total nutrition to transfer can't be under 1)
|
||||
var/nutritionThatBecomesFat = max((H.nutrition - NUTRITION_LEVEL_FULL)*(fatConversionRate / 100),1)
|
||||
H.nutrition -= nutritionThatBecomesFat
|
||||
H.adjust_fatness(nutritionThatBecomesFat, FATTENING_TYPE_FOOD)
|
||||
if(H.fullness > FULLNESS_LEVEL_EMPTY)//GS13 stomach-emptying routine
|
||||
var/ticksToEmptyStomach = 20 // GS13 how many ticks it takes to decrease the fullness by 1
|
||||
if(HAS_TRAIT(H, TRAIT_VORACIOUS))
|
||||
ticksToEmptyStomach = ticksToEmptyStomach * 0.5
|
||||
H.fullness -= 1/ticksToEmptyStomach
|
||||
if (H.fullness > FULLNESS_LEVEL_BLOATED) //GS13 overeating depends on fullness now
|
||||
if(H.overeatduration < 5000) //capped so people don't take forever to unfat
|
||||
H.overeatduration++
|
||||
else
|
||||
if(H.overeatduration > 1)
|
||||
H.overeatduration -= 1 //doubled the unfat rate -- GS13 Nah, put it back
|
||||
|
||||
//metabolism change
|
||||
if(H.nutrition > NUTRITION_LEVEL_FULL +100)
|
||||
H.metabolism_efficiency = 1
|
||||
else if(H.nutrition > NUTRITION_LEVEL_FED && H.satiety > 80)
|
||||
if(H.metabolism_efficiency != 1.25 && !HAS_TRAIT(H, TRAIT_NOHUNGER))
|
||||
to_chat(H, "<span class='notice'>You feel vigorous.</span>")
|
||||
H.metabolism_efficiency = 1.25
|
||||
else if(H.nutrition < NUTRITION_LEVEL_STARVING + 50)
|
||||
if(H.metabolism_efficiency != 0.8)
|
||||
to_chat(H, "<span class='notice'>You feel sluggish.</span>")
|
||||
H.metabolism_efficiency = 0.8
|
||||
else
|
||||
if(H.metabolism_efficiency == 1.25)
|
||||
to_chat(H, "<span class='notice'>You no longer feel vigorous.</span>")
|
||||
H.metabolism_efficiency = 1
|
||||
|
||||
switch(H.nutrition)
|
||||
if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL)
|
||||
H.clear_alert("nutrition")
|
||||
if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
|
||||
H.throw_alert("nutrition", /obj/screen/alert/hungry)
|
||||
if(0 to NUTRITION_LEVEL_STARVING)
|
||||
H.throw_alert("nutrition", /obj/screen/alert/starving)
|
||||
|
||||
switch(H.fullness)
|
||||
if(0 to FULLNESS_LEVEL_BLOATED)
|
||||
H.clear_alert("fullness")
|
||||
if(FULLNESS_LEVEL_BLOATED to FULLNESS_LEVEL_BEEG)
|
||||
H.throw_alert("fullness", /obj/screen/alert/bloated)
|
||||
if(FULLNESS_LEVEL_BEEG to FULLNESS_LEVEL_NOMOREPLZ)
|
||||
H.throw_alert("fullness", /obj/screen/alert/stuffed)
|
||||
if(FULLNESS_LEVEL_NOMOREPLZ to INFINITY)
|
||||
H.throw_alert("fullness", /obj/screen/alert/beegbelly)
|
||||
|
||||
|
||||
switch(H.fatness)
|
||||
if(FATNESS_LEVEL_BLOB to INFINITY)
|
||||
H.throw_alert("fatness", /obj/screen/alert/blob)
|
||||
|
||||
if(FATNESS_LEVEL_IMMOBILE to FATNESS_LEVEL_BLOB)
|
||||
H.throw_alert("fatness", /obj/screen/alert/immobile)
|
||||
|
||||
if(FATNESS_LEVEL_BARELYMOBILE to FATNESS_LEVEL_IMMOBILE)
|
||||
H.throw_alert("fatness", /obj/screen/alert/barelymobile)
|
||||
|
||||
if(FATNESS_LEVEL_EXTREMELY_OBESE to FATNESS_LEVEL_BARELYMOBILE)
|
||||
H.throw_alert("fatness", /obj/screen/alert/extremelyobese)
|
||||
|
||||
if(FATNESS_LEVEL_MORBIDLY_OBESE to FATNESS_LEVEL_EXTREMELY_OBESE)
|
||||
H.throw_alert("fatness", /obj/screen/alert/morbidlyobese)
|
||||
|
||||
if(FATNESS_LEVEL_OBESE to FATNESS_LEVEL_MORBIDLY_OBESE)
|
||||
H.throw_alert("fatness", /obj/screen/alert/obese)
|
||||
|
||||
if(FATNESS_LEVEL_VERYFAT to FATNESS_LEVEL_OBESE)
|
||||
H.throw_alert("fatness", /obj/screen/alert/veryfat)
|
||||
|
||||
if(FATNESS_LEVEL_FATTER to FATNESS_LEVEL_VERYFAT)
|
||||
H.throw_alert("fatness", /obj/screen/alert/fatter)
|
||||
|
||||
if(FATNESS_LEVEL_FAT to FATNESS_LEVEL_FATTER)
|
||||
H.throw_alert("fatness", /obj/screen/alert/fat)
|
||||
|
||||
if(0 to FATNESS_LEVEL_FAT)
|
||||
H.clear_alert("fatness")
|
||||
@@ -0,0 +1,94 @@
|
||||
// In vorecode, they're defined at code/_helpers/global_lists_vr.dm but we dont have that path at all, and I dont think it's a very good
|
||||
// path for a global lists file when there's code/_global_vars/lists as a directory. Im just putting this here for now. -Reo
|
||||
|
||||
//Blacklist to exclude items from object ingestion. Digestion blacklist located in digest_act_vr.dm
|
||||
var/global/list/item_vore_blacklist = list(
|
||||
/obj/item/hand_tele,
|
||||
//obj/item/weapon/card/id/gold/captain/spare, //Hugbox
|
||||
/obj/item/gun,
|
||||
/obj/item/pinpointer,
|
||||
/obj/item/clothing/shoes/magboots,
|
||||
/obj/item/areaeditor/blueprints,
|
||||
/obj/item/clothing/head/helmet/space,
|
||||
/obj/item/disk/nuclear
|
||||
//obj/item/clothing/suit/storage/hooded/wintercoat/roiz //You fluff decrease
|
||||
)
|
||||
|
||||
var/global/list/edible_trash = list(
|
||||
///obj/item/broken_device, //Doesnt exist
|
||||
/obj/item/clothing/neck/petcollar,
|
||||
///obj/item/device/communicator, // Doesnt exist
|
||||
/obj/item/clothing/mask,
|
||||
/obj/item/clothing/glasses,
|
||||
/obj/item/clothing/gloves,
|
||||
/obj/item/clothing/head,
|
||||
/obj/item/clothing/shoes,
|
||||
/obj/item/aicard, //Repathed from /obj/item/device/aicard
|
||||
/obj/item/flashlight,
|
||||
/obj/item/mmi/posibrain,
|
||||
/obj/item/paicard,
|
||||
/obj/item/pda,
|
||||
/obj/item/radio/headset,
|
||||
///obj/item/device/starcaster_news, //Doesnt exist
|
||||
///obj/item/inflatable/torn, //Doesnt exist
|
||||
/obj/item/organ,
|
||||
/obj/item/stack/sheet/cardboard,
|
||||
/obj/item/toy,
|
||||
/obj/item/trash,
|
||||
///obj/item/weapon/digestion_remains, // No former cuties (yet?)
|
||||
/obj/item/grown/bananapeel,
|
||||
///obj/item/weapon/bone, // Doesnt exist
|
||||
/obj/item/broken_bottle,
|
||||
/obj/item/card/emagfake,
|
||||
/obj/item/cigbutt,
|
||||
/obj/item/circuitboard,
|
||||
/obj/item/clipboard,
|
||||
/obj/item/grown/corncob,
|
||||
/obj/item/dice,
|
||||
/obj/item/match, //Repathed from /obj/item/weapon/flame
|
||||
/obj/item/lighter, //Added since they dont share a path of /flame anymore.
|
||||
/obj/item/light,
|
||||
/obj/item/lipstick,
|
||||
/obj/item/shard,
|
||||
/obj/item/newspaper,
|
||||
/obj/item/paper,
|
||||
/obj/item/paperplane,
|
||||
/obj/item/pen,
|
||||
/obj/item/photo,
|
||||
/obj/item/reagent_containers/food,
|
||||
/obj/item/reagent_containers/rag,
|
||||
/obj/item/soap,
|
||||
/obj/item/stack/spacecash,
|
||||
/obj/item/storage/box/matches,
|
||||
///obj/item/storage/box/wings, //Doesnt exist
|
||||
/obj/item/storage/fancy/candle_box,
|
||||
/obj/item/storage/fancy/cigarettes,
|
||||
/obj/item/storage/crayons,
|
||||
/obj/item/storage/fancy/egg_box,
|
||||
/obj/item/storage/wallet,
|
||||
///obj/item/weapon/storage/vore_egg, //Doesnt exist
|
||||
///obj/item/weapon/bikehorn/tinytether, //Doesnt exist
|
||||
///obj/item/capture_crystal, //Still doesnt exist.
|
||||
/obj/item/kitchen,
|
||||
/obj/item/storage/box/mre,
|
||||
///obj/item/storage/mrebag, //Doesnt exist
|
||||
///obj/item/weapon/storage/fancy/crackers, //Doesnt exist
|
||||
///obj/item/weapon/storage/fancy/heartbox, //Doesnt exist
|
||||
///obj/item/pizzavoucher, //Doesnt exist. Probably should, actually
|
||||
/obj/item/pizzabox,
|
||||
/obj/item/seeds,
|
||||
///obj/item/clothing/accessory/choker, //Doesnt exist
|
||||
/obj/item/clothing/accessory/medal,
|
||||
/obj/item/clothing/neck/tie,
|
||||
/obj/item/clothing/neck/scarf,
|
||||
///obj/item/clothing/accessory/bracelet, //Doesnt exist
|
||||
///obj/item/clothing/accessory/locket, //Doesnt exist
|
||||
/obj/item/storage/book/bible,
|
||||
/obj/item/bikehorn,
|
||||
//obj/item/inflatable/door/torn, //Doesnt exist
|
||||
/obj/item/reagent_containers/rag/towel, //Repath from /obj/item/towel
|
||||
/obj/item/folder,
|
||||
/obj/item/clipboard,
|
||||
/obj/item/coin,
|
||||
/obj/item/clothing/ears
|
||||
)
|
||||
@@ -0,0 +1,149 @@
|
||||
//we'll put funky non-toxic chems here
|
||||
|
||||
//fattening chem
|
||||
/datum/reagent/consumable/lipoifier
|
||||
name = "Lipoifier"
|
||||
description = "A very potent chemical that causes those that ingest it to build up fat cells quickly."
|
||||
taste_description = "lard"
|
||||
reagent_state = LIQUID
|
||||
color = "#e2e1b1"
|
||||
metabolization_rate = 0.5 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/consumable/lipoifier/on_mob_life(mob/living/carbon/M)
|
||||
M.adjust_fatness(15, FATTENING_TYPE_CHEM)
|
||||
return ..()
|
||||
|
||||
|
||||
//BURPY CHEM
|
||||
|
||||
/datum/reagent/consumable/fizulphite
|
||||
name = "Fizulphite"
|
||||
description = "A strange chemical that produces large amounts of gas when in contact with organic, typically fleshy environments."
|
||||
color = "#4cffed" // rgb: 102, 99, 0
|
||||
reagent_state = LIQUID
|
||||
taste_description = "fizziness"
|
||||
metabolization_rate = 2 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/consumable/fizulphite/on_mob_life(mob/living/carbon/M)
|
||||
if(M && M?.client?.prefs.weight_gain_chems)
|
||||
M.burpslurring = max(M.burpslurring,50)
|
||||
M.burpslurring += 2
|
||||
else
|
||||
M.burpslurring += 0
|
||||
..()
|
||||
|
||||
//ANTI-BURPY CHEM
|
||||
|
||||
/datum/reagent/consumable/extilphite
|
||||
name = "Extilphite"
|
||||
description = "A very useful chemical that helps soothe bloated stomachs."
|
||||
color = "#2aed96"
|
||||
reagent_state = LIQUID
|
||||
taste_description = "smoothness"
|
||||
metabolization_rate = 0.8 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/consumable/extilphite/on_mob_life(mob/living/carbon/M)
|
||||
if(M && M?.client?.prefs.weight_gain_chems)
|
||||
M.burpslurring -= 3
|
||||
else
|
||||
M.burpslurring -= 0
|
||||
|
||||
if(M.fullness>10)
|
||||
M.fullness -= 6
|
||||
else
|
||||
M.fullness -= 0
|
||||
..()
|
||||
|
||||
//FARTY CHEM
|
||||
|
||||
/datum/reagent/consumable/flatulose
|
||||
name = "Flatulose"
|
||||
description = "A sugar largely indigestible to most known organic organisms. Causes frequent flatulence."
|
||||
color = "#634500"
|
||||
reagent_state = LIQUID
|
||||
taste_description = "sulfury sweetness"
|
||||
metabolization_rate = 0.5 * REAGENTS_METABOLISM //Done by Zestyspy, Jan 2023
|
||||
|
||||
/datum/reagent/consumable/flatulose/on_mob_life(mob/living/carbon/M)
|
||||
if(M && M?.client?.prefs.weight_gain_chems)
|
||||
if(M.reagents.get_reagent_amount(/datum/reagent/consumable/flatulose) < 1)
|
||||
to_chat(M,"<span class='notice'>You feel substantially bloated...</span>")
|
||||
if(M.reagents.get_reagent_amount(/datum/reagent/consumable/flatulose) > 3)
|
||||
to_chat(M,"<span class='notice'>You feel pretty gassy...</span>")
|
||||
M.emote(pick("brap","fart")) // we gotta categorize this into "slob" category or something later! - GDLW2
|
||||
..()
|
||||
else
|
||||
return ..()
|
||||
|
||||
// calorite blessing chem, used in the golem ability
|
||||
|
||||
/datum/reagent/consumable/caloriteblessing
|
||||
name = "Calorite blessing"
|
||||
description = "A strange, viscous liquid derived from calorite. It is said to have physically enhancing properties surprisingly unrelated to weight gain when consumed"
|
||||
color = "#eb6e00"
|
||||
reagent_state = LIQUID
|
||||
taste_description = "sweet salvation"
|
||||
metabolization_rate = 0.5 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/consumable/caloriteblessing/on_mob_metabolize(mob/living/L)
|
||||
..()
|
||||
ADD_TRAIT(L, TRAIT_GOTTAGOFAST, type)
|
||||
|
||||
|
||||
/datum/reagent/consumable/caloriteblessing/on_mob_end_metabolize(mob/living/L)
|
||||
REMOVE_TRAIT(L, TRAIT_GOTTAGOFAST, type)
|
||||
..()
|
||||
|
||||
|
||||
//BLUEBERRY CHEM - ONLY CHANGES PLAYER'S COLOR AND NOTHING MORE
|
||||
|
||||
/datum/reagent/blueberry_juice
|
||||
name = "Blueberry Juice"
|
||||
description = "Totally infectious."
|
||||
reagent_state = LIQUID
|
||||
metabolization_rate = 0.25 * REAGENTS_METABOLISM
|
||||
color = "#0004ff"
|
||||
var/picked_color
|
||||
var/list/random_color_list = list("#0058db","#5d00c7","#0004ff","#0057e7")
|
||||
taste_description = "blueberry pie"
|
||||
var/no_mob_color = FALSE
|
||||
value = 10 //it sells. Make that berry factory
|
||||
|
||||
/datum/reagent/blueberry_juice/on_mob_life(mob/living/carbon/M)
|
||||
if(M?.client)
|
||||
if(!(M?.client?.prefs?.blueberry_inflation))
|
||||
M.reagents.remove_reagent(/datum/reagent/blueberry_juice, volume)
|
||||
return
|
||||
if(!no_mob_color)
|
||||
M.add_atom_colour(picked_color, WASHABLE_COLOUR_PRIORITY)
|
||||
M.adjust_fatness(1, FATTENING_TYPE_CHEM)
|
||||
..()
|
||||
|
||||
/datum/reagent/blueberry_juice/on_mob_add(mob/living/L, amount)
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/affected_mob = L
|
||||
if(!affected_mob?.client || !(affected_mob?.client?.prefs?.blueberry_inflation))
|
||||
affected_mob.reagents.remove_reagent(/datum/reagent/blueberry_juice, volume)
|
||||
return
|
||||
picked_color = pick(random_color_list)
|
||||
affected_mob.hider_add(src)
|
||||
else
|
||||
L.reagents.remove_reagent(/datum/reagent/blueberry_juice, volume)
|
||||
..()
|
||||
|
||||
/datum/reagent/blueberry_juice/on_mob_delete(mob/living/L)
|
||||
if(!iscarbon(L))
|
||||
return
|
||||
var/mob/living/carbon/C = L
|
||||
C.hider_remove(src)
|
||||
|
||||
/datum/reagent/blueberry_juice/proc/fat_hide()
|
||||
return (124 * (volume * volume))/1000 //123'840 600% size, about 56'000 400% size, calc was: (3 * (volume * volume))/50
|
||||
|
||||
// /obj/item/reagent_containers/food/snacks/meat/steak/troll
|
||||
// name = "Troll steak"
|
||||
// desc = "In its sliced state it remains dormant, but once the troll meat comes in contact with stomach acids, it begins a perpetual cycle of constant regrowth and digestion. You probably shouldn't eat this."
|
||||
// var/hunger_threshold = NUTRITION_LEVEL_FULL
|
||||
// var/nutrition_amount = 20 // somewhere around 5 pounds
|
||||
// var/fullness_to_add = 10
|
||||
// var/message = "<span class='notice'>You feel fuller...</span>" // GS13
|
||||
@@ -0,0 +1,28 @@
|
||||
///GS13 drinks!
|
||||
|
||||
/datum/reagent/consumable/ethanol/oily_oafs
|
||||
name = "Oily oafs"
|
||||
description = "The oily oaf. while it isn't as strong as some of the other drinks on station, Its buttery aftertaste and affordability make it a staple of any good miner's diet."
|
||||
color = "#ffc75f"
|
||||
boozepwr = 30
|
||||
taste_description = "rich butter and red sugar"
|
||||
//quality = DRINK_NICE we need to get drink quality implemented in our drink files -Eye
|
||||
glass_icon_state = "oily_oafs"
|
||||
glass_name = "oily oafs"
|
||||
glass_desc = "The oily oaf. A dwarvern classic beloved by miners around the cosmos."
|
||||
shot_glass_icon_state = "shotglassbrown"
|
||||
pH = 4.5
|
||||
value = 0.1
|
||||
|
||||
/datum/reagent/consumable/ethanol/glyphid_slammer
|
||||
name = "Glyphid slammer"
|
||||
description = "A mixture of strong beer and energy drink. How it manages to be as strong as it is baffles scientists to this day"
|
||||
color = "#FF8A33"
|
||||
boozepwr = 60
|
||||
taste_description = "Cheap booze and adventure"
|
||||
glass_icon_state = "glyphid_slammer"
|
||||
glass_name = "Glyphid slammer"
|
||||
glass_desc = "A bold mixture of cheap energy drink, and even cheaper ale. Beloved by partygoers and daredevils across the galaxy. Beloathed by bugpeople"
|
||||
shot_glass_icon_state = "shotglassbrown"
|
||||
pH = 4.5
|
||||
value = 0.1
|
||||
@@ -0,0 +1,159 @@
|
||||
//GS13 weight gain drinks
|
||||
|
||||
/datum/reagent/consumable/ethanol/belly_bloats
|
||||
name = "Belly Bloats"
|
||||
description = "A classic of this sector that bloats the waistline. Hard to stop chugging once you start."
|
||||
color = "#FF3333"
|
||||
boozepwr = 25
|
||||
taste_description = "a heavy mix of cherry and beer"
|
||||
quality = DRINK_GOOD
|
||||
glass_icon_state = "belly_bloats"
|
||||
glass_name = "belly bloats"
|
||||
glass_desc = "The perfect mix to be big and merry with."
|
||||
shot_glass_icon_state = "shotglassbrown"
|
||||
hydration = 3
|
||||
|
||||
/datum/reagent/consumable/ethanol/belly_bloats/on_mob_life(mob/living/carbon/M)
|
||||
if(M && M?.client?.prefs.weight_gain_food) // GS13
|
||||
M.nutrition += 15 * REAGENTS_METABOLISM
|
||||
else
|
||||
M.nutrition += 1
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/blobby_mary
|
||||
name = "Blobby Mary"
|
||||
description = "A bloody mary that may make you immobile. Still wondering if it's blood or tomato juice?"
|
||||
color = "#C2707E"
|
||||
boozepwr = 55
|
||||
taste_description = "tomateos and an anvil on your stomach"
|
||||
quality = DRINK_FANTASTIC
|
||||
glass_icon_state = "blobby_mary"
|
||||
glass_name = "blobby mary"
|
||||
glass_desc = "For the morbidly obese ladies and gentlemen."
|
||||
shot_glass_icon_state = "shotglassred"
|
||||
hydration = 4
|
||||
|
||||
/datum/reagent/consumable/ethanol/blobby_mary/on_mob_life(mob/living/carbon/M)
|
||||
if(M && M?.client?.prefs.weight_gain_food) // GS13
|
||||
M.nutrition += 25 * REAGENTS_METABOLISM
|
||||
else
|
||||
M.nutrition += 1
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/beltbuster_mead
|
||||
name = "Beltbuster Mead"
|
||||
description = "Kiss sobriety and clothes goodbye."
|
||||
color = "#664300"
|
||||
boozepwr = 85
|
||||
taste_description = "honey, alcohol and immobility"
|
||||
quality = DRINK_FANTASTIC
|
||||
glass_icon_state = "beltbuster_mead"
|
||||
glass_name = "beltbuster mead"
|
||||
glass_desc = "The ambrosia of the blubbery gods."
|
||||
shot_glass_icon_state = "shotglassgold"
|
||||
hydration = 4
|
||||
|
||||
/datum/reagent/consumable/ethanol/beltbuster_mead/on_mob_life(mob/living/carbon/M)
|
||||
if(M && M?.client?.prefs.weight_gain_food) // GS13
|
||||
M.nutrition += 30 * REAGENTS_METABOLISM
|
||||
else
|
||||
M.nutrition += 1
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/heavy_cafe
|
||||
name = "Heavy Cafe"
|
||||
description = "Coffee, milk, sugar and cream. For the days when you really don't want to work."
|
||||
color = "#663300"
|
||||
taste_description = "coffee, milk and sugar"
|
||||
quality = DRINK_GOOD
|
||||
glass_icon_state = "heavy_cafe"
|
||||
glass_name = "heavy cafe"
|
||||
glass_desc = "To enjoy slow mornings with."
|
||||
shot_glass_icon_state = "shotglassbrown"
|
||||
hydration = 3
|
||||
|
||||
/datum/reagent/consumable/heavy_cafe/on_mob_life(mob/living/carbon/M)
|
||||
M.dizziness = max(0,M.dizziness-5)
|
||||
M.drowsyness = max(0,M.drowsyness-3)
|
||||
M.SetSleeping(0, FALSE)
|
||||
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL)
|
||||
M.Jitter(5)
|
||||
if(M.getBruteLoss() && prob(20))
|
||||
M.heal_bodypart_damage(1,0, 0)
|
||||
if(M && M?.client?.prefs.weight_gain_food) // GS13
|
||||
M.nutrition += 15 * REAGENTS_METABOLISM
|
||||
else
|
||||
M.nutrition += 1
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/fruits_tea
|
||||
name = "Fruits Tea"
|
||||
description = "Somehow this mix of fruits and tea can cause considerable bulking."
|
||||
color = "#FFCC33"
|
||||
taste_description = "a sweet and sour mix"
|
||||
quality = DRINK_NICE
|
||||
glass_icon_state = "fruits_tea"
|
||||
glass_name = "fruits tea"
|
||||
glass_desc = "Goes down really easy and stays there for a long time."
|
||||
shot_glass_icon_state = "shotglassgold"
|
||||
hydration = 4
|
||||
|
||||
/datum/reagent/consumable/fruits_tea/on_mob_life(mob/living/carbon/M)
|
||||
M.dizziness = max(0,M.dizziness-2)
|
||||
M.drowsyness = max(0,M.drowsyness-1)
|
||||
M.jitteriness = max(0,M.jitteriness-3)
|
||||
M.AdjustSleeping(-20, FALSE)
|
||||
if(M.getToxLoss() && prob(20))
|
||||
M.adjustToxLoss(-1, 0)
|
||||
M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL)
|
||||
if(M && M?.client?.prefs.weight_gain_food) // GS13
|
||||
M.nutrition += 15 * REAGENTS_METABOLISM
|
||||
else
|
||||
M.nutrition += 1
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/consumable/snakebite
|
||||
name = "Snakebite"
|
||||
description = "Guaranteed to stop 100% of all moving."
|
||||
color = "#00CC33"
|
||||
taste_description = "bitter immobility"
|
||||
quality = DRINK_VERYGOOD
|
||||
glass_icon_state = "snakebite"
|
||||
glass_name = "snakebite"
|
||||
glass_desc = "Won't hurt like a real bite, but you'll still regert drinking this."
|
||||
shot_glass_icon_state = "shotglassgreen"
|
||||
hydration = 4
|
||||
|
||||
/datum/reagent/consumable/snakebite/on_mob_life(mob/living/carbon/M)
|
||||
if(M && M?.client?.prefs.weight_gain_food) // GS13
|
||||
M.nutrition += 25 * REAGENTS_METABOLISM
|
||||
else
|
||||
M.nutrition += 1
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/milkshake_vanilla
|
||||
name = "Vanilla Milkshake"
|
||||
description = "A plain vanilla milkshake. A classic."
|
||||
color = "#DFDFDF"
|
||||
taste_description = "creamy vanilla"
|
||||
quality = DRINK_VERYGOOD
|
||||
nutriment_factor = 6 * REAGENTS_METABOLISM
|
||||
glass_icon_state = "milkshake_vanilla"
|
||||
glass_name = "vanilla milkshake"
|
||||
glass_desc = "Guess they fixed the milkshake machine after all, huh?"
|
||||
shot_glass_icon_state = "shotglasscream"
|
||||
hydration = 3
|
||||
|
||||
/datum/reagent/consumable/milkshake_chocolate
|
||||
name = "Chocolate Milkshake"
|
||||
description = "It's like chocolate milk, but for even cooler kids."
|
||||
color = "#7D4E29"
|
||||
taste_description = "creamy chocolate"
|
||||
quality = DRINK_VERYGOOD
|
||||
nutriment_factor = 8 * REAGENTS_METABOLISM
|
||||
glass_icon_state = "milkshake_chocolate"
|
||||
glass_name = "chocolate milkshake"
|
||||
glass_desc = "Nothing better than cream AND cocoa!"
|
||||
shot_glass_icon_state = "shotglassbrown"
|
||||
hydration = 3
|
||||
@@ -0,0 +1,196 @@
|
||||
//Reagent
|
||||
/datum/reagent/fermi_fat
|
||||
name = "Galbanic Compound"
|
||||
description = "A chemical compound derived from lipoifier. Massively increases adipose mass and parts of it become impossible to shed through normal means."
|
||||
color = "#E70C0C"
|
||||
taste_description = "hunger"
|
||||
pH = 7
|
||||
overdose_threshold = 50
|
||||
metabolization_rate = REAGENTS_METABOLISM / 4
|
||||
can_synth = FALSE //DO NOT MAKE THIS SNYTHESIZABLE, THESE CHEMS ARE SUPPOSED TO NOT BE USED COMMONLY
|
||||
|
||||
overdose_threshold = 50
|
||||
addiction_threshold = 100
|
||||
addiction_stage1_end = 10
|
||||
addiction_stage2_end = 30
|
||||
addiction_stage3_end = 60
|
||||
addiction_stage4_end = 100
|
||||
|
||||
var/addiction_mults = 0
|
||||
|
||||
//Reaction
|
||||
/datum/chemical_reaction/fermi_fat
|
||||
name = "FermiFat"
|
||||
id = /datum/reagent/fermi_fat
|
||||
mix_message = "the reaction appears to swell!"
|
||||
required_reagents = list(/datum/reagent/consumable/lipoifier = 0.1, /datum/reagent/medicine/pen_acid = 0.1, /datum/reagent/iron = 0.1)
|
||||
results = list(/datum/reagent/fermi_fat = 0.2)
|
||||
required_temp = 1
|
||||
OptimalTempMin = 700 // Lower area of bell curve for determining heat based rate reactions
|
||||
OptimalTempMax = 740 // Upper end for above
|
||||
ExplodeTemp = 755 // Temperature at which reaction explodes
|
||||
OptimalpHMin = 2 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
|
||||
OptimalpHMax = 3.5 // Higest value for above
|
||||
ReactpHLim = 1 // How far out pH wil react, giving impurity place (Exponential phase)
|
||||
CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst)
|
||||
CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value)
|
||||
CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value)
|
||||
ThermicConstant = -10 // Temperature change per 1u produced
|
||||
HIonRelease = 0.02 // pH change per 1u reaction (inverse for some reason)
|
||||
RateUpLim = 2 // Optimal/max rate possible if all conditions are perfect
|
||||
FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics
|
||||
FermiExplode = FALSE // If the chemical explodes in a special way
|
||||
PurityMin = 0.1
|
||||
|
||||
//When added
|
||||
/datum/reagent/fermi_fat/on_mob_add(mob/living/carbon/M)
|
||||
. = ..()
|
||||
if(iscarbon(M))
|
||||
log_game("[M] ckey: [M.key] has ingested fermifat.")
|
||||
|
||||
//Effects
|
||||
/datum/reagent/fermi_fat/on_mob_life(mob/living/carbon/M)
|
||||
if(!iscarbon(M))
|
||||
return..()
|
||||
M.adjust_fatness(30, FATTENING_TYPE_CHEM)
|
||||
M.adjust_perma(1, FATTENING_TYPE_CHEM)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
//While overdosed
|
||||
/datum/reagent/fermi_fat/overdose_process(mob/living/M)
|
||||
if(!iscarbon(M))
|
||||
return..()
|
||||
var/mob/living/carbon/C = M
|
||||
C.adjust_fatness(20, FATTENING_TYPE_CHEM)
|
||||
C.adjust_perma(1, FATTENING_TYPE_CHEM)
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi_fat/overdose_start(mob/living/M)
|
||||
to_chat(M, "<span class='userdanger'>You took too much [name]! Your body is growing out of control!</span>")
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name)
|
||||
return
|
||||
|
||||
/datum/reagent/fermi_fat/addiction_act_stage1(mob/living/M)
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_light, name)
|
||||
if(prob(30))
|
||||
var/add_text = pick("You feel pretty hungry.", "You think of [name].", "Your look around for food.", "[name] wasn't so bad.")
|
||||
to_chat(M, "<span class='notice'>[add_text]</span>")
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
C.adjust_fatness(1, FATTENING_TYPE_CHEM)
|
||||
C.fullness = max(0, C.fullness-1)
|
||||
C.nutrition = max(0, C.nutrition-1)
|
||||
if(addiction_mults < 1)
|
||||
C.nutri_mult += 0.5
|
||||
C.weight_gain_rate += 0.25
|
||||
addiction_mults = 1
|
||||
return
|
||||
|
||||
/datum/reagent/fermi_fat/addiction_act_stage2(mob/living/M)
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_medium, name)
|
||||
if(prob(30))
|
||||
var/add_text = pick("You are very hungry.", "You could go for some [name].", "Your mouth waters.", "Is there any [name] around?")
|
||||
to_chat(M, "<span class='notice'>[add_text]</span>")
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
C.adjust_fatness(2, FATTENING_TYPE_CHEM)
|
||||
C.fullness = max(0, C.fullness-2)
|
||||
C.nutrition = max(0, C.nutrition-2)
|
||||
if(addiction_mults < 2)
|
||||
C.nutri_mult += 0.5
|
||||
C.weight_gain_rate += 0.25
|
||||
addiction_mults = 2
|
||||
return
|
||||
|
||||
/datum/reagent/fermi_fat/addiction_act_stage3(mob/living/M)
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_severe, name)
|
||||
if(prob(30))
|
||||
var/add_text = pick("You are starving!", "You need some [name]!", "Your stomach growls loudly!.", "You can't stop thinking about [name]")
|
||||
to_chat(M, "<span class='danger'>[add_text]</span>")
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
C.adjust_fatness(3, FATTENING_TYPE_CHEM)
|
||||
C.fullness = max(0, C.fullness-3)
|
||||
C.nutrition = max(0, C.nutrition-3)
|
||||
if(addiction_mults < 3)
|
||||
C.nutri_mult += 0.5
|
||||
C.weight_gain_rate += 0.25
|
||||
addiction_mults = 3
|
||||
return
|
||||
|
||||
/datum/reagent/fermi_fat/addiction_act_stage4(mob/living/M)
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_critical, name)
|
||||
if(prob(30))
|
||||
var/add_text = pick("You are ravenous!!", "You need [name] NOW!!", "You'd eat ANYTHING!!", "Where is the [name]?!", "Hungry, hungry, so HUNGRY!!", "More, you need more!!")
|
||||
to_chat(M, "<span class='boldannounce'>[add_text]</span>")
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
C.adjust_fatness(4, FATTENING_TYPE_CHEM)
|
||||
C.fullness = max(0, C.fullness-4)
|
||||
C.nutrition = max(0, C.nutrition-4)
|
||||
if(addiction_mults < 4)
|
||||
C.nutri_mult += 0.5
|
||||
C.weight_gain_rate += 0.25
|
||||
addiction_mults = 4
|
||||
return
|
||||
|
||||
/datum/reagent/fermi_fat/proc/addiction_remove(mob/living/carbon/C)
|
||||
if(addiction_mults > 0)
|
||||
C.nutri_mult = max(1, 0.5 * addiction_mults)
|
||||
C.weight_gain_rate = max(0,11, 0.25 * addiction_mults)
|
||||
return
|
||||
|
||||
//Reagent
|
||||
/datum/reagent/fermi_slim
|
||||
name = "Macerinic Solution"
|
||||
description = "A solution with unparalleled obesity-solving properties. One of the few things known to be capable of removing galbanic fat."
|
||||
color = "#3b0ce7"
|
||||
taste_description = "thinness"
|
||||
pH = 7
|
||||
metabolization_rate = REAGENTS_METABOLISM / 4
|
||||
can_synth = FALSE
|
||||
|
||||
overdose_threshold = 50
|
||||
|
||||
//Reaction
|
||||
/datum/chemical_reaction/fermi_slim
|
||||
name = "FermiSlim"
|
||||
id = /datum/reagent/fermi_slim
|
||||
mix_message = "the reaction seems to become thinner!"
|
||||
required_reagents = list(/datum/reagent/medicine/lipolicide = 0.1, /datum/reagent/ammonia = 0.1, /datum/reagent/oxygen = 0.1)
|
||||
results = list(/datum/reagent/fermi_slim = 0.2)
|
||||
required_temp = 1
|
||||
OptimalTempMin = 600 // Lower area of bell curve for determining heat based rate reactions
|
||||
OptimalTempMax = 650 // Upper end for above
|
||||
ExplodeTemp = 700 // Temperature at which reaction explodes
|
||||
OptimalpHMin = 10 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
|
||||
OptimalpHMax = 11.5 // Higest value for above
|
||||
ReactpHLim = 1 // How far out pH wil react, giving impurity place (Exponential phase)
|
||||
CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst)
|
||||
CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value)
|
||||
CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value)
|
||||
ThermicConstant = -10 // Temperature change per 1u produced
|
||||
HIonRelease = -0.02 // pH change per 1u reaction (inverse for some reason)
|
||||
RateUpLim = 2 // Optimal/max rate possible if all conditions are perfect
|
||||
FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics
|
||||
FermiExplode = FALSE // If the chemical explodes in a special way
|
||||
PurityMin = 0.1
|
||||
|
||||
//Effects
|
||||
/datum/reagent/fermi_slim/on_mob_life(mob/living/carbon/M)
|
||||
if(!iscarbon(M))
|
||||
return..()
|
||||
M.adjust_fatness(-50, FATTENING_TYPE_WEIGHT_LOSS)
|
||||
M.adjust_perma(-5, FATTENING_TYPE_WEIGHT_LOSS)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/fermi_slim/overdose_process(mob/living/M)
|
||||
if(!iscarbon(M))
|
||||
return..()
|
||||
var/mob/living/carbon/C = M
|
||||
C.fullness = max(0, C.fullness-5)
|
||||
C.nutrition = max(0, C.nutrition-5)
|
||||
C.weight_loss_rate = min(5, C.weight_loss_rate+0.01)
|
||||
..()
|
||||
@@ -0,0 +1,14 @@
|
||||
//DRG drinks
|
||||
|
||||
|
||||
/datum/chemical_reaction/oily_oafs
|
||||
name = "Oily oafs"
|
||||
id = /datum/reagent/consumable/ethanol/oily_oafs
|
||||
results = list(/datum/reagent/consumable/ethanol/oily_oafs = 2)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/cream = 1)
|
||||
|
||||
/datum/chemical_reaction/glyphid_slammer
|
||||
name = "Glyphid slammer"
|
||||
id = /datum/reagent/consumable/ethanol/glyphid_slammer
|
||||
results = list(/datum/reagent/consumable/ethanol/glyphid_slammer = 2)
|
||||
required_reagents = list(/datum/reagent/consumable/pwr_game = 1, /datum/reagent/consumable/ethanol/beer = 1)
|
||||
@@ -0,0 +1,29 @@
|
||||
//GS13 - fat chems
|
||||
|
||||
//WG chem
|
||||
/datum/chemical_reaction/lipoifier
|
||||
name = "lipoifier"
|
||||
id = /datum/reagent/consumable/lipoifier
|
||||
results = list(/datum/reagent/consumable/lipoifier = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/cornoil = 1, /datum/reagent/medicine/synthflesh = 1)
|
||||
|
||||
//BURP CHEM
|
||||
/datum/chemical_reaction/fizulphite
|
||||
name = "fizulphite"
|
||||
id = /datum/reagent/consumable/fizulphite
|
||||
results = list(/datum/reagent/consumable/fizulphite = 5)
|
||||
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 3)
|
||||
|
||||
//ANTI-BURP / ANTI-FULLNESS CHEM
|
||||
/datum/chemical_reaction/extilphite
|
||||
name = "extilphite"
|
||||
id = /datum/reagent/consumable/extilphite
|
||||
results = list(/datum/reagent/consumable/extilphite = 5)
|
||||
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/hydrogen = 2, /datum/reagent/carbon = 2)
|
||||
|
||||
// brap chem
|
||||
/datum/chemical_reaction/flatulose
|
||||
name = "flatulose"
|
||||
id = /datum/reagent/consumable/flatulose
|
||||
results = list(/datum/reagent/consumable/flatulose = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/toxin/bad_food = 1, /datum/reagent/consumable/cream = 1)
|
||||
@@ -0,0 +1,55 @@
|
||||
//GS13 drink recipes
|
||||
|
||||
/datum/chemical_reaction/belly_bloats
|
||||
name = "Belly Bloats"
|
||||
id = /datum/reagent/consumable/ethanol/belly_bloats
|
||||
results = list(/datum/reagent/consumable/ethanol/belly_bloats = 2)
|
||||
required_reagents = list(/datum/reagent/consumable/gibbfloats = 1, /datum/reagent/consumable/ethanol/beer = 1)
|
||||
|
||||
/datum/chemical_reaction/blobby_mary
|
||||
name = "Blobby Mary"
|
||||
id = /datum/reagent/consumable/ethanol/blobby_mary
|
||||
results = list(/datum/reagent/consumable/ethanol/blobby_mary = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/tomatojuice = 1, /datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/lipoifier = 1)
|
||||
|
||||
/datum/chemical_reaction/beltbuster_mead
|
||||
name = "Beltbuster Mead"
|
||||
id = /datum/reagent/consumable/ethanol/beltbuster_mead
|
||||
results = list(/datum/reagent/consumable/ethanol/beltbuster_mead = 4)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/mead = 1, /datum/reagent/consumable/ethanol = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/lipoifier = 1)
|
||||
|
||||
/datum/chemical_reaction/heavy_cafe1
|
||||
name = "Heavy Cafe"
|
||||
id = /datum/reagent/consumable/heavy_cafe
|
||||
results = list(/datum/reagent/consumable/heavy_cafe = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/cafe_latte = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/cream = 1)
|
||||
|
||||
/datum/chemical_reaction/heavy_cafe2
|
||||
name = "Heavy Cafe"
|
||||
id = /datum/reagent/consumable/heavy_cafe
|
||||
results = list(/datum/reagent/consumable/heavy_cafe = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/soy_latte = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/cream = 1)
|
||||
|
||||
/datum/chemical_reaction/fruits_tea
|
||||
name = "Fruits Tea"
|
||||
id = /datum/reagent/consumable/fruits_tea
|
||||
results = list(/datum/reagent/consumable/fruits_tea = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/berryjuice = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/tea = 1)
|
||||
|
||||
/datum/chemical_reaction/snakebite
|
||||
name = "Snakebite"
|
||||
id = /datum/reagent/consumable/snakebite
|
||||
results = list(/datum/reagent/consumable/snakebite = 3)
|
||||
required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/lipoifier = 1)
|
||||
|
||||
/datum/chemical_reaction/milkshake_vanilla
|
||||
name = "Vanilla Milkshake"
|
||||
id = /datum/reagent/consumable/milkshake_vanilla
|
||||
results = list(/datum/reagent/consumable/milkshake_vanilla = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/vanilla = 1)
|
||||
|
||||
/datum/chemical_reaction/milkshake_chocolate
|
||||
name = "Chocolate Milkshake"
|
||||
id = /datum/reagent/consumable/milkshake_chocolate
|
||||
results = list(/datum/reagent/consumable/milkshake_chocolate = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/milk/chocolate_milk = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/coco = 1)
|
||||
@@ -0,0 +1,79 @@
|
||||
//chug tank
|
||||
/obj/item/reagent_containers/barrel_tank
|
||||
name = "barrel tank"
|
||||
desc = "A wooden barrely with straps and a tube attached. One can only wonder what it's for."
|
||||
icon = 'GainStation13/icons/obj/barrel_tank.dmi'
|
||||
icon_state = "barrel_tank"
|
||||
item_state = "barrel_tank"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
reagent_flags = REFILLABLE | TRANSPARENT
|
||||
actions_types = list(/datum/action/item_action/toggle_tube)
|
||||
|
||||
var/mob/living/carbon/U = null
|
||||
var/transfer_amount = 1
|
||||
|
||||
amount_per_transfer_from_this = 0
|
||||
possible_transfer_amounts = list(0)
|
||||
volume = 500
|
||||
spillable = FALSE
|
||||
splashable = FALSE
|
||||
|
||||
/obj/item/reagent_containers/barrel_tank/ui_action_click(mob/user)
|
||||
toggle_tube(user)
|
||||
|
||||
/obj/item/reagent_containers/barrel_tank/proc/toggle_tube(mob/living/user)
|
||||
if(!istype(user))
|
||||
return
|
||||
if(user.get_item_by_slot(user.getBackSlot()) != src)
|
||||
to_chat(user, "<span class='warning'>The barrel must be worn properly to use!</span>")
|
||||
return
|
||||
if(user.incapacitated())
|
||||
return
|
||||
|
||||
if(!U)
|
||||
to_chat(user, "<span class='notice'>You put the barrel's tube in your mouth.</span>")
|
||||
U = user
|
||||
START_PROCESSING(SSobj, src)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You remove the barrel's tube from your mouth.</span>")
|
||||
U = null
|
||||
|
||||
/obj/item/reagent_containers/barrel_tank/verb/toggle_tube_verb()
|
||||
set name = "Toggle Tube"
|
||||
set category = "Object"
|
||||
toggle_tube(usr)
|
||||
|
||||
/obj/item/reagent_containers/barrel_tank/equipped(mob/user, slot)
|
||||
..()
|
||||
if(slot != SLOT_BACK && U != null)
|
||||
to_chat(user, "<span class='warning'>The barrel's tube slips out of your mouth!</span>")
|
||||
U = null
|
||||
|
||||
/obj/item/reagent_containers/barrel_tank/dropped(mob/user)
|
||||
..()
|
||||
U = null
|
||||
|
||||
/obj/item/reagent_containers/barrel_tank/process()
|
||||
if(U == null)
|
||||
return PROCESS_KILL
|
||||
|
||||
if(reagents.total_volume)
|
||||
var/fraction = min(1/reagents.total_volume, 1)
|
||||
reagents.reaction(U, INGEST, fraction, FALSE)
|
||||
reagents.trans_to(U, transfer_amount, 2)
|
||||
else
|
||||
to_chat(U, "<span class='warning'>The barrel is empty!</span>")
|
||||
U = null
|
||||
|
||||
/obj/item/reagent_containers/barrel_tank/attack_self(mob/user)
|
||||
if(reagents.total_volume > 0)
|
||||
to_chat(user, "<span class='notice'>You empty [src] of all reagents.</span>")
|
||||
reagents.clear_reagents()
|
||||
|
||||
/datum/crafting_recipe/barrel_tank
|
||||
name = "Barrel tank"
|
||||
result = /obj/item/reagent_containers/barrel_tank
|
||||
tools = list(TOOL_CROWBAR)
|
||||
reqs = list(/obj/item/stack/sheet/mineral/wood = 20)
|
||||
category = CAT_CLOTHING
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/design/infrared_emitter
|
||||
name = "Fatness Infrared Emitter"
|
||||
id = "fatness_infrared_emitter"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
|
||||
build_path = /obj/item/assembly/infra/fat
|
||||
category = list("initial", "Misc")
|
||||
@@ -0,0 +1,251 @@
|
||||
/////////////////////////////////////////
|
||||
///GS13 designs / nutri designs
|
||||
/////////////////////////////////////////
|
||||
|
||||
|
||||
//nutritech weapons
|
||||
/datum/design/fatoray_weak
|
||||
name = "Basic Fatoray"
|
||||
id = "fatoray_weak"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 8000, MAT_GLASS = 6000, MAT_CALORITE = 10000)
|
||||
construction_time = 75
|
||||
build_path = /obj/item/gun/energy/fatoray/weak
|
||||
category = list("Weapons")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/datum/design/fatoray_cannon_weak
|
||||
name = "Basic Cannonshot Fatoray"
|
||||
id = "fatoray_cannon_weak"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 10000, MAT_GLASS = 8000, MAT_CALORITE = 20000)
|
||||
construction_time = 200
|
||||
build_path = /obj/item/gun/energy/fatoray/cannon_weak
|
||||
category = list("Weapons")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/datum/design/alter_ray_metabolism
|
||||
name = "AL-T-Ray: Metabolism"
|
||||
id = "alter_ray_metabolism"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 10000, MAT_GLASS = 8000, MAT_CALORITE = 26000)
|
||||
construction_time = 200
|
||||
build_path = /obj/item/gun/energy/laser/alter_ray/gainrate
|
||||
category = list("Weapons")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
|
||||
/datum/design/alter_ray_reverser
|
||||
name = "AL-T-Ray: Reverser"
|
||||
id = "alter_ray_reverser"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 10000, MAT_GLASS = 8000, MAT_CALORITE = 26000)
|
||||
construction_time = 200
|
||||
build_path = /obj/item/gun/energy/laser/alter_ray/noloss
|
||||
category = list("Weapons")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
//nutritech tools
|
||||
/datum/design/calorite_collar
|
||||
name = "Calorite Collar"
|
||||
desc = "A collar that amplifies caloric intake of the wearer."
|
||||
id = "calorite_collar"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 1000, MAT_CALORITE = 4000)
|
||||
construction_time = 75
|
||||
build_path = /obj/item/clothing/neck/petcollar/calorite
|
||||
category = list("Equipment", "Misc", "Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ALL
|
||||
|
||||
/datum/design/cyberimp_nutriment_turbo
|
||||
name = "Nutriment Pump Implant TURBO"
|
||||
desc = "This implant was meant to prevent people from going hungry, but due to a flaw in its designs, it permanently produces a small amount of nutriment overtime."
|
||||
id = "ci-nutrimentturbo"
|
||||
build_type = PROTOLATHE | MECHFAB
|
||||
construction_time = 100
|
||||
materials = list(MAT_METAL = 800, MAT_GLASS = 800, MAT_GOLD = 750, MAT_URANIUM = 1000)
|
||||
build_path = /obj/item/organ/cyberimp/chest/nutriment/turbo
|
||||
category = list("Misc", "Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/cyberimp_fat_mobility
|
||||
name = "Mobility Nanite Core"
|
||||
desc = "This implant contains nanites that reinforce leg muscles, allowing for unimpeded movement at extreme weights."
|
||||
id = "ci-fatmobility"
|
||||
build_type = PROTOLATHE | MECHFAB
|
||||
construction_time = 100
|
||||
materials = list(MAT_METAL = 800, MAT_GLASS = 800, MAT_GOLD = 750, MAT_URANIUM = 1000)
|
||||
build_path = /obj/item/organ/cyberimp/chest/mobility
|
||||
category = list("Misc", "Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/bluespace_belt
|
||||
name = "Bluespace Belt"
|
||||
desc = "A belt made using bluespace technology. The power of space and time, used to hide the fact you are fat."
|
||||
id = "bluespace_belt"
|
||||
build_type = PROTOLATHE
|
||||
construction_time = 100
|
||||
materials = list(MAT_SILVER = 4000, MAT_GOLD = 4000, MAT_BLUESPACE = 2000, )
|
||||
build_path = /obj/item/bluespace_belt
|
||||
category = list("Misc", "Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/cookie_synthesizer
|
||||
name = "Cookie Synthesizer"
|
||||
desc = "A self-charging miraculous device that's able to produce cookies."
|
||||
id = "cookie_synthesizer"
|
||||
build_type = PROTOLATHE
|
||||
construction_time = 100
|
||||
materials = list(MAT_SILVER = 4000, MAT_URANIUM = 1000, MAT_BLUESPACE = 1000, MAT_CALORITE = 2000)
|
||||
build_path = /obj/item/cookiesynth
|
||||
category = list("Misc", "Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
//these are made in mech fabricator
|
||||
/datum/design/borg_cookie_synthesizer
|
||||
name = "Cyborg Upgrade (Cookie Synthesizer)"
|
||||
id = "borg_upgrade_cookiesynthesizer"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/borg/upgrade/cookiesynth
|
||||
materials = list(MAT_METAL=10000, MAT_GOLD=1500, MAT_URANIUM=250, MAT_PLASMA=1500)
|
||||
construction_time = 100
|
||||
category = list("Cyborg Upgrade Modules")
|
||||
|
||||
/datum/design/borg_fatoray
|
||||
name = "Cyborg Upgrade (Fatoray)"
|
||||
id = "borg_upgrade_fatoray"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/borg/upgrade/fatoray
|
||||
materials = list(MAT_METAL = 8000, MAT_GLASS = 6000, MAT_CALORITE = 10000)
|
||||
construction_time = 100
|
||||
category = list("Cyborg Upgrade Modules")
|
||||
|
||||
/datum/design/borg_feedtube
|
||||
name = "Cyborg Upgrade (Feeding Tube)"
|
||||
id = "borg_upgrade_feedingtube"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/borg/upgrade/feedtube
|
||||
materials = list(MAT_METAL = 8000, MAT_GLASS = 6000, MAT_CALORITE = 10000)
|
||||
construction_time = 100
|
||||
category = list("Cyborg Upgrade Modules")
|
||||
|
||||
//todo: make a seperate file for extra borg modules
|
||||
|
||||
/obj/item/borg/upgrade/cookiesynth
|
||||
name = "cyborg cookie synthesizer"
|
||||
desc = "An extra module that allows cyborgs to dispense cookies."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
|
||||
/obj/item/borg/upgrade/cookiesynth/action(mob/living/silicon/robot/R, user = usr)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/obj/item/cookiesynth/S = new(R.module)
|
||||
R.module.basic_modules += S
|
||||
R.module.add_module(S, FALSE, TRUE)
|
||||
|
||||
/obj/item/borg/upgrade/cookiesynth/deactivate(mob/living/silicon/robot/R, user = usr)
|
||||
. = ..()
|
||||
if (.)
|
||||
var/obj/item/cookiesynth/S = locate() in R.module
|
||||
R.module.remove_module(S, TRUE)
|
||||
|
||||
|
||||
/obj/item/gun/energy/fatoray/weak/cyborg
|
||||
name = "cyborg fatoray"
|
||||
desc = "An integrated fatoray for cyborg use."
|
||||
icon = 'GainStation13/icons/obj/fatoray.dmi'
|
||||
icon_state = "fatoray_weak"
|
||||
can_charge = FALSE
|
||||
selfcharge = EGUN_SELFCHARGE_BORG
|
||||
cell_type = /obj/item/stock_parts/cell/secborg
|
||||
charge_delay = 5
|
||||
|
||||
/obj/item/borg/upgrade/fatoray
|
||||
name = "cyborg fatoray module"
|
||||
desc = "An extra module that allows cyborgs to use fatoray weapons."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
|
||||
/obj/item/borg/upgrade/fatoray/action(mob/living/silicon/robot/R, user = usr)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/obj/item/gun/energy/fatoray/weak/cyborg/S = new(R.module)
|
||||
R.module.basic_modules += S
|
||||
R.module.add_module(S, FALSE, TRUE)
|
||||
|
||||
/obj/item/borg/upgrade/fatoray/deactivate(mob/living/silicon/robot/R, user = usr)
|
||||
. = ..()
|
||||
if (.)
|
||||
var/obj/item/gun/energy/fatoray/weak/cyborg/S = locate() in R.module
|
||||
R.module.remove_module(S, TRUE)
|
||||
|
||||
|
||||
|
||||
//cyborg regen feeding tube
|
||||
|
||||
/obj/item/reagent_containers/borghypo/feeding_tube
|
||||
name = "cyborg feeding tube"
|
||||
desc = "A feeding tube module for a cyborg."
|
||||
icon = 'GainStation13/icons/obj/feeding_tube.dmi'
|
||||
icon_state = "borg_tube"
|
||||
possible_transfer_amounts = list(5,10,20)
|
||||
charge_cost = 20
|
||||
recharge_time = 3
|
||||
accepts_reagent_upgrades = FALSE
|
||||
reagent_ids = list(/datum/reagent/consumable/cream, /datum/reagent/consumable/milk, /datum/reagent/consumable/nutriment)
|
||||
var/starttime = 0
|
||||
var/chemtoadd = 5
|
||||
|
||||
/obj/item/reagent_containers/borghypo/feeding_tube/attack(mob/living/carbon/M, mob/user)
|
||||
var/datum/reagents/R = reagent_list[mode]
|
||||
if(!R.total_volume)
|
||||
to_chat(user, "<span class='notice'>The injector is empty.</span>")
|
||||
return
|
||||
if(!istype(M))
|
||||
return
|
||||
if(R.total_volume && M.can_inject(user, 1, user.zone_selected,bypass_protection))
|
||||
|
||||
if(M == user.pulling && ishuman(user.pulling))
|
||||
starttime = world.time
|
||||
while(starttime + 300 > world.time && in_range(user, M))
|
||||
if(do_mob(user, M, 10, 0, 1))
|
||||
M.reagents.add_reagent(/datum/reagent/consumable/nutriment, chemtoadd)
|
||||
M.visible_message("<span class='danger'>[user] pumps some liquid in [M]!</span>","<span class='userdanger'>[user] pumps some liquid in you!</span>")
|
||||
else
|
||||
to_chat(M, "<span class='warning'>You feel the cyborg's feeding tube pour liquid down your throat!</span>")
|
||||
to_chat(user, "<span class='warning'>You feed [M] with the integrated feeding tube.</span>")
|
||||
visible_message("<span class='warning'>The cyborg's feeding tube pours liquid down [M]'s throat!</span>")
|
||||
var/fraction = min(amount_per_transfer_from_this/R.total_volume, 1)
|
||||
R.reaction(M, INJECT, fraction)
|
||||
if(M.reagents)
|
||||
var/trans = R.trans_to(M, amount_per_transfer_from_this)
|
||||
to_chat(user, "<span class='notice'>[trans] unit\s injected. [R.total_volume] unit\s remaining.</span>")
|
||||
|
||||
/obj/item/reagent_containers/borghypo/feeding_tube/regenerate_reagents()
|
||||
if(iscyborg(src.loc))
|
||||
var/mob/living/silicon/robot/R = src.loc
|
||||
if(R && R.cell)
|
||||
for(var/i in modes) //Lots of reagents in this one, so it's best to regenrate them all at once to keep it from being tedious.
|
||||
var/valueofi = modes[i]
|
||||
var/datum/reagents/RG = reagent_list[valueofi]
|
||||
if(RG.total_volume < RG.maximum_volume)
|
||||
R.cell.use(charge_cost)
|
||||
RG.add_reagent(reagent_ids[valueofi], 5)
|
||||
|
||||
|
||||
/obj/item/borg/upgrade/feedtube
|
||||
name = "cyborg feeding tube module"
|
||||
desc = "An extra module that allows cyborgs to use an integrated feeding tube along with a synthesizer."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
|
||||
/obj/item/borg/upgrade/feedtube/action(mob/living/silicon/robot/R, user = usr)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/obj/item/reagent_containers/borghypo/feeding_tube/S = new(R.module)
|
||||
R.module.basic_modules += S
|
||||
R.module.add_module(S, FALSE, TRUE)
|
||||
|
||||
/obj/item/borg/upgrade/feedtube/deactivate(mob/living/silicon/robot/R, user = usr)
|
||||
. = ..()
|
||||
if (.)
|
||||
var/obj/item/reagent_containers/borghypo/feeding_tube/S = locate() in R.module
|
||||
R.module.remove_module(S, TRUE)
|
||||
@@ -0,0 +1,161 @@
|
||||
/datum/nanite_rule/fatness
|
||||
name = "BFI"
|
||||
desc = "Checks the host's BFI."
|
||||
|
||||
var/threshold = 50
|
||||
var/above = TRUE
|
||||
|
||||
/datum/nanite_rule/fatness/check_rule()
|
||||
if(iscarbon(program.host_mob))
|
||||
var/mob/living/carbon/C = program.host_mob
|
||||
var/BFI = C.fatness_real
|
||||
if(above)
|
||||
if(BFI >= threshold)
|
||||
return TRUE
|
||||
else
|
||||
if(BFI < threshold)
|
||||
return TRUE
|
||||
return FALSE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/datum/nanite_rule/fatness/display()
|
||||
return "[name] [above ? ">" : "<"] [threshold]"
|
||||
|
||||
/datum/nanite_program/sensor/fat_sensor
|
||||
name = "BFI Sensor"
|
||||
desc = "The nanites receive a signal when the host's BFI is below or exceeds a certain amount."
|
||||
can_rule = TRUE
|
||||
var/spent = FALSE
|
||||
|
||||
/datum/nanite_program/sensor/fat_sensor/register_extra_settings()
|
||||
. = ..()
|
||||
extra_settings[NES_FATNESS] = new /datum/nanite_extra_setting/number(0, 0, 3440, "BFI")
|
||||
extra_settings[NES_DIRECTION] = new /datum/nanite_extra_setting/boolean(TRUE, "Above", "Below")
|
||||
|
||||
/datum/nanite_program/sensor/fat_sensor/check_event()
|
||||
if(iscarbon(host_mob))
|
||||
var/mob/living/carbon/C = host_mob
|
||||
var/datum/nanite_extra_setting/level = extra_settings[NES_FATNESS]
|
||||
var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION]
|
||||
var/detected = FALSE
|
||||
if(direction.get_value())
|
||||
if(C.fatness >= level.get_value())
|
||||
detected = TRUE
|
||||
else
|
||||
if(C.fatness < level.get_value())
|
||||
detected = TRUE
|
||||
|
||||
if(detected)
|
||||
if(!spent)
|
||||
spent = TRUE
|
||||
return TRUE
|
||||
return FALSE
|
||||
else
|
||||
spent = FALSE
|
||||
return FALSE
|
||||
return FALSE
|
||||
|
||||
/datum/nanite_program/sensor/fat_sensor/make_rule(datum/nanite_program/target)
|
||||
var/datum/nanite_rule/fatness/rule = new(target)
|
||||
var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION]
|
||||
var/datum/nanite_extra_setting/level = extra_settings[NES_FATNESS]
|
||||
rule.above = direction.get_value()
|
||||
rule.threshold = level.get_value()
|
||||
return rule
|
||||
|
||||
/datum/design/nanites/fat_sensor
|
||||
name = "BFI Sensor"
|
||||
desc = "The nanites boost can detect the host's BFI."
|
||||
id = "fat_sensor_nanites"
|
||||
program_type = /datum/nanite_program/sensor/fat_sensor
|
||||
category = list("Sensor Nanites")
|
||||
|
||||
/datum/nanite_program/fat_adjuster
|
||||
name = "BFI Regulator"
|
||||
desc = "The nanites act on the host's adipose tissues, removing or adding based on the specified preference. Nanites consumed are equal to value added/lost"
|
||||
use_rate = 0
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
|
||||
/datum/nanite_program/fat_adjuster/register_extra_settings()
|
||||
. = ..()
|
||||
extra_settings[NES_FATNESS] = new /datum/nanite_extra_setting/number(0, -10, 10, "BFI")
|
||||
|
||||
/datum/nanite_program/fat_adjuster/check_conditions()
|
||||
var/datum/nanite_extra_setting/BFI = extra_settings[NES_FATNESS]
|
||||
if(iscarbon(host_mob))
|
||||
var/mob/living/carbon/C = host_mob
|
||||
if(BFI.get_value() < 0)
|
||||
if(C.fatness_real <= 0)
|
||||
return FALSE
|
||||
else
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/nanite_program/fat_adjuster/active_effect()
|
||||
var/datum/nanite_extra_setting/BFI = extra_settings[NES_FATNESS]
|
||||
if(iscarbon(host_mob))
|
||||
var/mob/living/carbon/C = host_mob
|
||||
if(BFI.get_value() > 0)
|
||||
if(consume_nanites(BFI.get_value()))
|
||||
C.adjust_fatness(BFI.get_value(), FATTENING_TYPE_NANITES)
|
||||
else
|
||||
if(consume_nanites(-(BFI.get_value())))
|
||||
C.adjust_fatness(BFI.get_value(), FATTENING_TYPE_WEIGHT_LOSS)
|
||||
|
||||
/datum/design/nanites/fat_adjuster
|
||||
name = "BFI Regulator"
|
||||
desc = "The nanites adjust the host's BFI."
|
||||
id = "fat_adjuster_nanites"
|
||||
program_type = /datum/nanite_program/fat_adjuster
|
||||
category = list("Medical Nanites")
|
||||
|
||||
/datum/nanite_program/fat_converter
|
||||
name = "Adipose Conversion"
|
||||
desc = "Nanites learn to convert excess body mass to replicate."
|
||||
rogue_types = list(/datum/nanite_program/necrotic)
|
||||
|
||||
/datum/nanite_program/fat_converter/check_conditions()
|
||||
if(iscarbon(host_mob))
|
||||
var/mob/living/carbon/C = host_mob
|
||||
if(C.fatness_real <= 0 || nanites.nanite_volume >= nanites.max_nanites)
|
||||
return FALSE
|
||||
else
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/nanite_program/fat_converter/active_effect()
|
||||
if(iscarbon(host_mob))
|
||||
var/mob/living/carbon/C = host_mob
|
||||
if(C.fatness_real > 0 && nanites.nanite_volume < nanites.max_nanites)
|
||||
nanites.adjust_nanites(src, min(round(C.fatness_real), 5))
|
||||
C.adjust_fatness(-(min(round(C.fatness_real), 5)), FATTENING_TYPE_WEIGHT_LOSS)
|
||||
|
||||
/datum/design/nanites/fat_converter
|
||||
name = "Adipose Conversion"
|
||||
desc = "The nanites use fat to replicate quickly."
|
||||
id = "fat_converter_nanites"
|
||||
program_type = /datum/nanite_program/fat_converter
|
||||
category = list("Medical Nanites")
|
||||
|
||||
/datum/nanite_program/bwomf
|
||||
name = "B.W.O.M.F." //Body Widening Operation for Mass Fattening
|
||||
desc = "Nanites remains on standy-by, massively increasing the host's mass on trigger.."
|
||||
unique = FALSE
|
||||
can_trigger = TRUE
|
||||
trigger_cost = 50
|
||||
trigger_cooldown = 50
|
||||
rogue_types = list(/datum/nanite_program/toxic)
|
||||
|
||||
/datum/nanite_program/bwomf/on_trigger(comm_message)
|
||||
if(iscarbon(host_mob))
|
||||
var/mob/living/carbon/C = host_mob
|
||||
C.adjust_fatness(100, FATTENING_TYPE_NANITES)
|
||||
to_chat(C, "<span class='warning'>[pick("Your belly expands quickly!", "Fat envelops you further!", "Lard grows all over you!")]</span>")
|
||||
|
||||
/datum/design/nanites/bwomf
|
||||
name = "B.W.O.M.F."
|
||||
desc = "Massively increase host's mass on trigger."
|
||||
id = "bwomf_nanites"
|
||||
program_type = /datum/nanite_program/bwomf
|
||||
category = list("Medical Nanites")
|
||||
@@ -0,0 +1,23 @@
|
||||
/////////////// GS13 - NUTRITIONAL TECHNOLOGY
|
||||
|
||||
/datum/techweb_node/nutritech_tools
|
||||
id = "nutritech_tools"
|
||||
display_name = "Nutri-Tech Tools"
|
||||
description = "Ending world hunger was never made easier!"
|
||||
prereq_ids = list("biotech", "adv_engi")
|
||||
design_ids = list("calorite_collar", "ci-nutrimentturbo", "bluespace_belt", "adipoelectric_transformer", "cookie_synthesizer", "borg_upgrade_cookiesynthesizer", "borg_upgrade_feedingtube", "ci-fatmobility")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
boost_item_paths = list(/obj/item/gun/energy/fatoray, /obj/item/gun/energy/fatoray/cannon, /obj/item/trash/fatoray_scrap1, /obj/item/trash/fatoray_scrap2)
|
||||
export_price = 5000
|
||||
hidden = TRUE
|
||||
|
||||
/datum/techweb_node/nutritech_weapons
|
||||
id = "nutritech_weapons"
|
||||
display_name = "Nutri-Tech Weapons"
|
||||
description = "Ever wanted to reach your daily caloric intake in just 5 seconds?"
|
||||
prereq_ids = list("biotech", "adv_engi")
|
||||
design_ids = list("fatoray_weak", "fatoray_cannon_weak", "alter_ray_metabolism", "alter_ray_reverser", "borg_upgrade_fatoray", "bwomf_nanites")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
|
||||
boost_item_paths = list(/obj/item/gun/energy/fatoray, /obj/item/gun/energy/fatoray/cannon, /obj/item/trash/fatoray_scrap1, /obj/item/trash/fatoray_scrap2)
|
||||
export_price = 10000
|
||||
hidden = TRUE
|
||||
@@ -0,0 +1,25 @@
|
||||
//GS13 - implants and similar
|
||||
|
||||
/obj/item/organ/cyberimp/chest/nutriment/turbo
|
||||
name = "Nutriment pump implant TURBO"
|
||||
desc = "This implant was meant to prevent people from going hungry, but due to a flaw in its designs, it permanently produces a small amount of nutriment overtime."
|
||||
icon_state = "chest_implant"
|
||||
implant_color = "#006607"
|
||||
nutrition_amount = 20 //somewhere around 5 pounds
|
||||
hunger_threshold = NUTRITION_LEVEL_FULL
|
||||
poison_amount = 10
|
||||
message = "" //no message cuz spam is annoying
|
||||
|
||||
/obj/item/organ/cyberimp/chest/mobility
|
||||
name = "Mobility Nanite Core"
|
||||
desc = "This implant contains nanites that reinforce leg muscles, allowing for unimpeded movement at extreme weights."
|
||||
icon_state = "chest_implant"
|
||||
implant_color = "#9034db"
|
||||
|
||||
/obj/item/organ/cyberimp/chest/mobility/Insert(mob/living/carbon/M, special = 0)
|
||||
..()
|
||||
ADD_TRAIT(M, TRAIT_NO_FAT_SLOWDOWN, src)
|
||||
|
||||
/obj/item/organ/cyberimp/chest/mobility/Remove(mob/living/carbon/M, special = 0)
|
||||
REMOVE_TRAIT(M, TRAIT_NO_FAT_SLOWDOWN, src)
|
||||
..()
|
||||
@@ -0,0 +1,29 @@
|
||||
/obj/machinery/vending/gato
|
||||
name = "GATO Vending Machine"
|
||||
desc = "A GATO branded cola machine, a cute little cat is plastered onto it."
|
||||
icon = 'icons/obj/vending.dmi'
|
||||
icon_state = "cola_black"
|
||||
product_slogans = "Meow~, time for some cola!"
|
||||
vend_reply = "Meow~ Meow~"
|
||||
products = list(
|
||||
/obj/item/reagent_containers/food/drinks/beer = 10,
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 10,
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb = 10,
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/starkist = 10,
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/space_up = 10,
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
|
||||
)
|
||||
contraband = list(
|
||||
/obj/item/organ/ears/cat = 2,
|
||||
)
|
||||
premium = list(
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/air = 20,
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/fizzwiz = 5,
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/soothseltz = 8,
|
||||
)
|
||||
|
||||
refill_canister = /obj/item/vending_refill/mealdor
|
||||
|
||||
/obj/item/vending_refill/mealdor
|
||||
machine_name = "Meal Vendor Refill"
|
||||
icon_state = "refill_mealdor"
|
||||
@@ -0,0 +1,54 @@
|
||||
/obj/machinery/vending/mealdor
|
||||
name = "Meal Vendor"
|
||||
desc = "The vending machine used by starving people. Looks like they've changed the shell, it looks cuter."
|
||||
icon = 'icons/obj/vending.dmi'
|
||||
icon_state = "mealdor"
|
||||
product_slogans = "Are you hungry? Eat some of my food!;Be sure to eat one of our tasty treats!;Was that your stomach? Go ahead, get some food!"
|
||||
vend_reply = "Enjoy your meal."
|
||||
products = list(
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/cheese = 10,
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice = 10,
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/pound_cake = 8,
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/bsvc = 5,
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/bscc = 5,
|
||||
// /obj/item/reagent_containers/food/snacks/donut/purefat = 10,
|
||||
/obj/item/reagent_containers/food/snacks/fries = 10,
|
||||
/obj/item/reagent_containers/food/snacks/donut = 20,
|
||||
/obj/item/reagent_containers/food/snacks/candiedapple = 7,
|
||||
/obj/item/reagent_containers/food/snacks/burrito = 8,
|
||||
/obj/item/reagent_containers/food/snacks/enchiladas = 10,
|
||||
/obj/item/reagent_containers/food/snacks/spaghetti = 20,
|
||||
/obj/item/reagent_containers/food/snacks/kebab/rat = 7,
|
||||
/obj/item/reagent_containers/food/snacks/kebab/rat/double = 6,
|
||||
/obj/item/reagent_containers/food/snacks/meatballspaghetti = 10,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/orangejuice = 10,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/pineapplejuice = 10,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/strawberryjuice = 10,
|
||||
/obj/item/reagent_containers/food/drinks/beer = 10,
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 10,
|
||||
/obj/item/reagent_containers/food/snacks/pizza/margherita = 10,
|
||||
/obj/item/reagent_containers/food/snacks/butterdog = 12,
|
||||
/obj/item/reagent_containers/food/snacks/burger/plain = 20,
|
||||
/obj/item/reagent_containers/food/snacks/burger/bearger = 10,
|
||||
/obj/item/reagent_containers/food/snacks/pie/plump_pie = 8,
|
||||
/obj/item/reagent_containers/food/snacks/dough = 20
|
||||
)
|
||||
contraband = list(
|
||||
/obj/item/clothing/mask/fakemoustache = 5,
|
||||
/obj/item/clothing/head/chefhat = 5,
|
||||
/obj/item/reagent_containers/food/snacks/cookie = 10,
|
||||
/obj/item/reagent_containers/food/snacks/salad/fruit = 15,
|
||||
/obj/item/reagent_containers/food/snacks/salad = 20,
|
||||
/obj/item/reagent_containers/food/snacks/salad/hellcobb = 10,
|
||||
/obj/item/clothing/under/cowkini = 5,
|
||||
/obj/item/reagent_containers/food/snacks/blueberry_gum = 5
|
||||
)
|
||||
premium = list(
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/air = 3,
|
||||
/obj/item/reagent_containers/food/snacks/donut/chaos = 3,
|
||||
/obj/item/clothing/mask/cowmask/gag = 2,
|
||||
/obj/item/clothing/mask/pig/gag = 2
|
||||
)
|
||||
|
||||
refill_canister = /obj/item/vending_refill/mealdor
|
||||
Reference in New Issue
Block a user