mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-28 18:11:16 +00:00
## About The Pull Request Over half of the line changes are merely from splitting the fish_types.dm into several files since it was over 1k lines already. One of the small issues with fishing right now is RNG. You want to get some specific fish, and you go through all the micromanaging with hooks, reels and baits only for the random number god to say "nope", and that's only going to get worse the more fish are in the game. However, I've a solution: (unconsumable/reusable) fishing lures, each of which attracts different fish based on different conditions. The only caveat is that they require to be spun at set intervals (usually 1 to 3 seconds, depending on the lure, with a second-long window). Worry not, there're visual cues in the form of a green/red light hovering the fishing float, so you won't get screwed up by the server slowing down or whatever. The whole box of lures (12 so far) can be from cargo for the fair price of 450 credits. I've also added 5 new fish: monkfish, plaice, pike, another punnier variant of the pike, perch and squid. The latter is quite special because of the ink production trait, which lets players use it to blind others at a close range and when butchered, it yields an ink sac, which can be processed into a can of squid ink (one less item exclusive to the produce console), or thrown at people in a sort-of-similar fashion of banana cream pies (except it's ink). <details> <summary>Images</summary> Fishing lures (forgot to take my cursor off the veggie one before the screenshot):  The five new fish:  </details> <details> <summary>A table of fish catchable wth each lure (excluding holodeck)</summary>  </details> A few more things in the CL, baitfish are a thing now. ## Why It's Good For The Game There should be ways to contrast some of the RNG fishing has. After all, it's only going to get more random the more fish are in the game. Furthermore, I find it disappointing that a lot of food stuff is exclusive to the ingredients console and there're no other ways to get it. ## Changelog 🆑 add: Added fishing lures to the game. They don't get used up like baits and let you catch specific kinds of fish, though they need to be spun every few seconds. The whole set can be ordered from cargo for 450 credits. balance: The magnet hook now removes dud chances. add: Added five new fish types: perch, two types of pike, monkfish, plaice and squid. Squids have a fairly special ink production trait, which lets you use them (unless dead) to ink people face at close range, and can be butchered for an ink sac, which can either be processed into canned squid ink, or thrown at someone. fix: Refactored throwing a little. Some items (specifically components/elements) won't be triggered when caught. no more plates shattering despite being caught for example. add: Goldfish, lavaloops, needlefish and armorfish can now be used as baits. /🆑
343 lines
14 KiB
Plaintext
343 lines
14 KiB
Plaintext
// Pre-packaged meals, canned, wrapped, and vended
|
|
|
|
// Cans
|
|
/obj/item/food/canned
|
|
name = "Canned Air"
|
|
desc = "If you ever wondered where air came from..."
|
|
food_reagents = list(
|
|
/datum/reagent/oxygen = 6,
|
|
/datum/reagent/nitrogen = 24,
|
|
)
|
|
icon = 'icons/obj/food/canned.dmi'
|
|
icon_state = "peachcan"
|
|
food_flags = FOOD_IN_CONTAINER
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
max_volume = 30
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
preserved_food = TRUE
|
|
|
|
/obj/item/food/canned/make_germ_sensitive(mapload)
|
|
return // It's in a can
|
|
|
|
/obj/item/food/canned/proc/open_can(mob/user)
|
|
to_chat(user, span_notice("You pull back the tab of \the [src]."))
|
|
playsound(user.loc, 'sound/items/foodcanopen.ogg', 50)
|
|
reagents.flags |= OPENCONTAINER
|
|
preserved_food = FALSE
|
|
|
|
/obj/item/food/canned/attack_self(mob/user)
|
|
if(!is_drainable())
|
|
open_can(user)
|
|
icon_state = "[icon_state]_open"
|
|
return ..()
|
|
|
|
/obj/item/food/canned/attack(mob/living/target, mob/user, def_zone)
|
|
if (!is_drainable())
|
|
to_chat(user, span_warning("[src]'s lid hasn't been opened!"))
|
|
return FALSE
|
|
return ..()
|
|
|
|
/obj/item/food/canned/beans
|
|
name = "tin of beans"
|
|
desc = "Musical fruit in a slightly less musical container."
|
|
icon_state = "beans"
|
|
trash_type = /obj/item/trash/can/food/beans
|
|
food_reagents = list(
|
|
/datum/reagent/consumable/nutriment = 4,
|
|
/datum/reagent/consumable/nutriment/protein = 9,
|
|
/datum/reagent/consumable/ketchup = 4,
|
|
)
|
|
tastes = list("beans" = 1)
|
|
foodtypes = VEGETABLES
|
|
crafting_complexity = FOOD_COMPLEXITY_1
|
|
|
|
/obj/item/food/canned/peaches
|
|
name = "canned peaches"
|
|
desc = "Just a nice can of ripe peaches swimming in their own juices."
|
|
icon_state = "peachcan"
|
|
trash_type = /obj/item/trash/can/food/peaches
|
|
food_reagents = list(
|
|
/datum/reagent/consumable/peachjuice = 20,
|
|
/datum/reagent/consumable/sugar = 8,
|
|
/datum/reagent/consumable/nutriment = 2,
|
|
)
|
|
tastes = list("peaches" = 7, "tin" = 1)
|
|
foodtypes = FRUIT | SUGAR
|
|
|
|
/obj/item/food/canned/peaches/maint
|
|
name = "Maintenance Peaches"
|
|
desc = "I have a mouth and I must eat."
|
|
icon_state = "peachcanmaint"
|
|
trash_type = /obj/item/trash/can/food/peaches/maint
|
|
tastes = list("peaches" = 1, "tin" = 7)
|
|
venue_value = FOOD_PRICE_EXOTIC
|
|
|
|
/obj/item/food/canned/tomatoes
|
|
name = "canned San Marzano tomatoes"
|
|
desc = "A can of premium San Marzano tomatoes, from the hills of Southern Italy."
|
|
icon_state = "tomatoescan"
|
|
trash_type = /obj/item/trash/can/food/tomatoes
|
|
food_reagents = list(
|
|
/datum/reagent/consumable/tomatojuice = 20,
|
|
/datum/reagent/consumable/salt = 2,
|
|
)
|
|
tastes = list("tomato" = 7, "tin" = 1)
|
|
foodtypes = VEGETABLES //fuck you, real life!
|
|
|
|
/obj/item/food/canned/pine_nuts
|
|
name = "canned pine nuts"
|
|
desc = "A small can of pine nuts. Can be eaten on their own, if you're into that."
|
|
icon_state = "pinenutscan"
|
|
trash_type = /obj/item/trash/can/food/pine_nuts
|
|
food_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3)
|
|
tastes = list("pine nuts" = 1)
|
|
foodtypes = NUTS
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
|
|
/obj/item/food/canned/envirochow
|
|
name = "dog eat dog envirochow"
|
|
desc = "The first pet food product that is made fully sustainable by employing ancient British animal husbandry techniques."
|
|
icon_state = "envirochow"
|
|
trash_type = /obj/item/trash/can/food/envirochow
|
|
food_reagents = list(
|
|
/datum/reagent/consumable/nutriment/protein = 9,
|
|
/datum/reagent/consumable/nutriment/vitamin = 4,
|
|
)
|
|
tastes = list("dog food" = 5, "狗肉" = 3)
|
|
foodtypes = MEAT | GROSS
|
|
crafting_complexity = FOOD_COMPLEXITY_1
|
|
|
|
/obj/item/food/canned/envirochow/attack_animal(mob/living/simple_animal/user, list/modifiers)
|
|
if(!check_buffability(user))
|
|
return ..()
|
|
apply_buff(user)
|
|
|
|
/obj/item/food/canned/envirochow/attack_basic_mob(mob/living/basic/user, list/modifiers)
|
|
if(!check_buffability(user))
|
|
return ..()
|
|
apply_buff(user)
|
|
|
|
/obj/item/food/canned/envirochow/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
|
|
if(!check_buffability(interacting_with))
|
|
return NONE
|
|
apply_buff(interacting_with, user)
|
|
return ITEM_INTERACT_SUCCESS
|
|
|
|
///This proc checks if the mob is able to receive the buff.
|
|
/obj/item/food/canned/envirochow/proc/check_buffability(mob/living/hungry_pet)
|
|
if(!isanimal_or_basicmob(hungry_pet)) // Not a pet
|
|
return FALSE
|
|
if(!is_drainable()) // Can is not open
|
|
return FALSE
|
|
if(hungry_pet.stat) // Parrot deceased
|
|
return FALSE
|
|
if(hungry_pet.mob_biotypes & (MOB_BEAST|MOB_REPTILE|MOB_BUG))
|
|
return TRUE
|
|
else
|
|
return FALSE // Humans, robots & spooky ghosts not allowed
|
|
|
|
///This makes the animal eat the food, and applies the buff status effect to them.
|
|
/obj/item/food/canned/envirochow/proc/apply_buff(mob/living/simple_animal/hungry_pet, mob/living/dog_mom)
|
|
hungry_pet.apply_status_effect(/datum/status_effect/limited_buff/health_buff) //the status effect keeps track of the stacks
|
|
hungry_pet.visible_message(
|
|
span_notice("[hungry_pet] chows down on [src]."),
|
|
span_nicegreen("You chow down on [src]."),
|
|
span_notice("You hear sloppy eating noises."))
|
|
SEND_SIGNAL(src, COMSIG_FOOD_CONSUMED, hungry_pet, dog_mom ? dog_mom : hungry_pet) //If there is no dog mom, we assume the pet fed itself.
|
|
playsound(loc, 'sound/items/eatfood.ogg', rand(30, 50), TRUE)
|
|
qdel(src)
|
|
|
|
/obj/item/food/canned/squid_ink
|
|
name = "canned squid ink"
|
|
desc = "An odd ingredient in typical cooking, squid ink lends a taste of the sea to any dish- while also dyeing it jet black in the process."
|
|
icon_state = "squidinkcan"
|
|
trash_type = /obj/item/trash/can/food/squid_ink
|
|
food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/salt = 5)
|
|
tastes = list("seafood" = 7, "tin" = 1)
|
|
foodtypes = SEAFOOD
|
|
|
|
/obj/item/food/canned/squid_ink/open_can(mob/user)
|
|
. = ..()
|
|
AddComponent(/datum/component/splat, \
|
|
memory_type = /datum/memory/witnessed_inking, \
|
|
smudge_type = /obj/effect/decal/cleanable/food/squid_ink, \
|
|
moodlet_type = /datum/mood_event/inked, \
|
|
splat_color = COLOR_NEARLY_ALL_BLACK, \
|
|
hit_callback = CALLBACK(src, PROC_REF(blind_em)), \
|
|
)
|
|
ADD_TRAIT(src, TRAIT_UNCATCHABLE, INNATE_TRAIT) //good luck catching the liquid
|
|
|
|
/obj/item/food/canned/squid_ink/proc/blind_em(mob/living/victim, can_splat_on)
|
|
if(can_splat_on)
|
|
victim.adjust_temp_blindness_up_to(7 SECONDS, 10 SECONDS)
|
|
victim.adjust_confusion_up_to(3.5 SECONDS, 6 SECONDS)
|
|
victim.Paralyze(2 SECONDS) //splat!
|
|
victim.visible_message(span_warning("[victim] is inked by [src]!"), span_userdanger("You've been inked by [src]!"))
|
|
playsound(victim, SFX_DESECRATION, 50, TRUE)
|
|
|
|
/obj/item/food/canned/chap
|
|
name = "can of CHAP"
|
|
desc = "CHAP: Chopped Ham And Pork. The classic American canned meat product that won a world war, then sent millions of servicemen home with heart congestion."
|
|
icon_state = "chapcan"
|
|
trash_type = /obj/item/trash/can/food/chap
|
|
food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/salt = 5)
|
|
tastes = list("meat" = 7, "tin" = 1)
|
|
foodtypes = MEAT
|
|
|
|
/obj/item/food/canned/chap/make_processable()
|
|
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/chapslice, 5, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut")
|
|
|
|
/obj/item/food/chapslice
|
|
name = "slice of chap"
|
|
desc = "A thin slice of chap. Useful for frying, or making sandwiches."
|
|
icon = 'icons/obj/food/martian.dmi'
|
|
icon_state = "chapslice"
|
|
food_reagents = list(
|
|
/datum/reagent/consumable/nutriment/vitamin = 3
|
|
)
|
|
tastes = list("meat" = 1)
|
|
foodtypes = MEAT
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
|
|
/obj/item/food/chapslice/make_grillable()
|
|
AddComponent(/datum/component/grillable, /obj/item/food/grilled_chapslice, rand(20 SECONDS, 40 SECONDS), TRUE, TRUE)
|
|
|
|
/obj/item/food/grilled_chapslice
|
|
name = "grilled slice of chap"
|
|
desc = "A greasy hot slice of chap. Forms a good part of a balanced meal."
|
|
icon = 'icons/obj/food/martian.dmi'
|
|
icon_state = "chapslice_grilled"
|
|
food_reagents = list(
|
|
/datum/reagent/consumable/nutriment/vitamin = 3
|
|
)
|
|
tastes = list("meat" = 1)
|
|
foodtypes = MEAT
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
|
|
// DONK DINNER: THE INNOVATIVE WAY TO GET YOUR DAILY RECOMMENDED ALLOWANCE OF SALT... AND THEN SOME!
|
|
/obj/item/food/ready_donk
|
|
name = "\improper Ready-Donk: Bachelor Chow"
|
|
desc = "A quick Donk-dinner: now with flavour!"
|
|
icon_state = "ready_donk"
|
|
trash_type = /obj/item/trash/ready_donk
|
|
food_reagents = list(/datum/reagent/consumable/nutriment = 5)
|
|
tastes = list("food?" = 2, "laziness" = 1)
|
|
foodtypes = MEAT | JUNKFOOD
|
|
food_flags = FOOD_FINGER_FOOD
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
|
|
/// What type of ready-donk are we warmed into?
|
|
var/warm_type = /obj/item/food/ready_donk/warm
|
|
|
|
/// What reagents should be added when this item is warmed?
|
|
var/static/list/added_reagents = list(/datum/reagent/medicine/omnizine = 3)
|
|
|
|
/obj/item/food/ready_donk/make_bakeable()
|
|
AddComponent(/datum/component/bakeable, warm_type, rand(15 SECONDS, 20 SECONDS), TRUE, TRUE, added_reagents)
|
|
|
|
/obj/item/food/ready_donk/make_microwaveable()
|
|
AddElement(/datum/element/microwavable, warm_type, added_reagents)
|
|
|
|
/obj/item/food/ready_donk/examine_more(mob/user)
|
|
. = ..()
|
|
. += span_notice("<i>You browse the back of the box...</i>")
|
|
. += "\t[span_info("Ready-Donk: a product of Donk Co.")]"
|
|
. += "\t[span_info("Heating instructions: open box and pierce film, heat in microwave on high for 2 minutes. Allow to stand for 60 seconds prior to eating. Product will be hot.")]"
|
|
. += "\t[span_info("Per 200g serving contains: 8g Sodium; 25g Fat, of which 22g are saturated; 2g Sugar.")]"
|
|
return .
|
|
|
|
/obj/item/food/ready_donk/warm
|
|
name = "warm Ready-Donk: Bachelor Chow"
|
|
desc = "A quick Donk-dinner, now with flavour! And it's even hot!"
|
|
icon_state = "ready_donk_warm"
|
|
food_reagents = list(
|
|
/datum/reagent/consumable/nutriment = 5,
|
|
/datum/reagent/medicine/omnizine = 3,
|
|
)
|
|
tastes = list("food?" = 2, "laziness" = 1)
|
|
|
|
// Don't burn your warn ready donks.
|
|
warm_type = /obj/item/food/badrecipe
|
|
|
|
/obj/item/food/ready_donk/mac_n_cheese
|
|
name = "\improper Ready-Donk: Donk-a-Roni"
|
|
desc = "Neon-orange mac n' cheese in seconds!"
|
|
tastes = list("cheesy pasta" = 2, "laziness" = 1)
|
|
foodtypes = GRAIN | DAIRY | JUNKFOOD
|
|
|
|
warm_type = /obj/item/food/ready_donk/warm/mac_n_cheese
|
|
|
|
/obj/item/food/ready_donk/warm/mac_n_cheese
|
|
name = "warm Ready-Donk: Donk-a-Roni"
|
|
desc = "Neon-orange mac n' cheese, ready to eat!"
|
|
icon_state = "ready_donk_warm_mac"
|
|
tastes = list("cheesy pasta" = 2, "laziness" = 1)
|
|
foodtypes = GRAIN | DAIRY | JUNKFOOD
|
|
|
|
/obj/item/food/ready_donk/donkhiladas
|
|
name = "\improper Ready-Donk: Donkhiladas"
|
|
desc = "Donk Co's signature Donkhiladas with Donk sauce, for an 'authentic' taste of Mexico."
|
|
tastes = list("enchiladas" = 2, "laziness" = 1)
|
|
foodtypes = GRAIN | DAIRY | MEAT | VEGETABLES | JUNKFOOD
|
|
|
|
warm_type = /obj/item/food/ready_donk/warm/donkhiladas
|
|
|
|
/obj/item/food/ready_donk/warm/donkhiladas
|
|
name = "warm Ready-Donk: Donkhiladas"
|
|
desc = "Donk Co's signature Donkhiladas with Donk sauce, served as hot as the Mexican sun."
|
|
icon_state = "ready_donk_warm_mex"
|
|
tastes = list("enchiladas" = 2, "laziness" = 1)
|
|
foodtypes = GRAIN | DAIRY | MEAT | VEGETABLES | JUNKFOOD
|
|
|
|
/obj/item/food/ready_donk/nachos_grandes //which translates to... big nachos
|
|
name = "\improper Ready-Donk: Donk Sol Series Boritos Nachos Grandes"
|
|
desc = "Get ready for game day with Donk's classic Nachos Grandes, sponsors of the Donk Sol Series! Boritos chips loaded with cheese, spicy meat and beans, alongside separate guac, pico and donk sauce. Batter up!"
|
|
tastes = list("nachos" = 2, "laziness" = 1)
|
|
foodtypes = GRAIN | DAIRY | MEAT | VEGETABLES | JUNKFOOD
|
|
|
|
warm_type = /obj/item/food/ready_donk/warm/nachos_grandes
|
|
|
|
/obj/item/food/ready_donk/warm/nachos_grandes
|
|
name = "warm Ready-Donk: Donk Sol Series Boritos Nachos Grandes"
|
|
desc = "Get ready for game day with Donk's classic Nachos Grandes, sponsors of the Donk Sol Series! Boritos chips loaded with cheese, spicy meat and beans, alongside separate guac, pico and donk sauce. Served hotter than Sakamoto's fastball!"
|
|
icon_state = "ready_donk_warm_nachos"
|
|
tastes = list("nachos" = 2, "laziness" = 1)
|
|
foodtypes = GRAIN | DAIRY | MEAT | VEGETABLES | JUNKFOOD
|
|
|
|
/obj/item/food/ready_donk/donkrange_chicken
|
|
name = "\improper Ready-Donk: Donk-range Chicken"
|
|
desc = "A Chinese classic, it's Donk's original spicy orange chicken with stir-fried peppers and onions, all over steamed rice."
|
|
tastes = list("orange chicken" = 2, "laziness" = 1)
|
|
foodtypes = GRAIN | MEAT | VEGETABLES | JUNKFOOD
|
|
|
|
warm_type = /obj/item/food/ready_donk/warm/donkrange_chicken
|
|
|
|
/obj/item/food/ready_donk/warm/donkrange_chicken
|
|
name = "warm Ready-Donk: Ready-Donk: Donk-range Chicken"
|
|
desc = "A Chinese classic, it's Donk's original spicy orange chicken with stir-fried peppers and onions, all over steamed rice and served hotter than a dragon's breath."
|
|
icon_state = "ready_donk_warm_orange"
|
|
tastes = list("orange chicken" = 2, "laziness" = 1)
|
|
foodtypes = GRAIN | MEAT | VEGETABLES | JUNKFOOD
|
|
|
|
// Rations
|
|
/obj/item/food/rationpack
|
|
name = "ration pack"
|
|
desc = "A square bar that sadly <i>looks</i> like chocolate, packaged in a nondescript grey wrapper. Has saved soldiers' lives before - usually by stopping bullets."
|
|
icon_state = "rationpack"
|
|
bite_consumption = 3
|
|
junkiness = 15
|
|
tastes = list("cardboard" = 3, "sadness" = 3)
|
|
foodtypes = null //Don't ask what went into them. You're better off not knowing.
|
|
food_reagents = list(
|
|
/datum/reagent/consumable/nutriment/stabilized = 10,
|
|
/datum/reagent/consumable/nutriment = 2,
|
|
) //Won't make you fat. Will make you question your sanity.
|
|
|
|
///Override for checkliked callback
|
|
/obj/item/food/rationpack/make_edible()
|
|
. = ..()
|
|
AddComponent(/datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_liked)))
|
|
|
|
/obj/item/food/rationpack/proc/check_liked(mob/mob) //Nobody likes rationpacks. Nobody.
|
|
return FOOD_DISLIKED
|