The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package NetHack::Item::Spoiler::Food;
our $VERSION = '0.12';


use strict;
use warnings;
use base 'NetHack::Item::Spoiler';
use NetHack::Monster::Spoiler;

use constant type => 'food';

sub _list {
    my $food = {
        'meatball' => {
            price => 5, weight => 1, nutrition => 5, time => 1,
            plural => 'meatballs', stackable => 1, material => 'flesh',
            vegan => 0, vegetarian => 0,
        },
        'meat ring' => {
            price => 5, weight => 1, nutrition => 5, time => 1,
            plural => 'meat rings', stackable => 0, material => 'flesh',
            vegan => 0, vegetarian => 0,
        },
        'meat stick' => {
            price => 5, weight => 1, nutrition => 5, time => 1,
            plural => 'meat sticks', stackable => 1, material => 'flesh',
            vegan => 0, vegetarian => 0,
        },
        'tripe ration' => {
            price => 15, weight => 10, nutrition => 200, time => 2, unsafe => 1,
            plural => 'tripe rations', stackable => 1, material => 'flesh',
            vegan => 0, vegetarian => 0,
        },
        'huge chunk of meat' => {
            price => 105, weight => 400, nutrition => 2000, time => 20,
            plural => 'huge chunks of meat', stackable => 1,
            material => 'flesh',
            vegan => 0, vegetarian => 0,
        },
        'kelp frond' => {
            price => 6, weight => 1, nutrition => 30, time => 1,
            plural => 'kelp fronds', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'eucalyptus leaf' => {
            price => 6, weight => 1, nutrition => 30, time => 1,
            plural => 'eucalyptus leaves', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'clove of garlic' => {
            price => 7, weight => 1, nutrition => 40, time => 1,
            plural => 'cloves of garlic', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'sprig of wolfsbane' => {
            price => 7, weight => 1, nutrition => 40, time => 1,
            plural => 'sprigs of wolfsbane', stackable => 1,
            material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'apple' => {
            price => 7, weight => 2, nutrition => 50, time => 1,
            plural => 'apples', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'carrot' => {
            price => 7, weight => 2, nutrition => 50, time => 1,
            plural => 'carrots', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'pear' => {
            price => 7, weight => 2, nutrition => 50, time => 1,
            plural => 'pears', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'banana' => {
            price => 9, weight => 2, nutrition => 80, time => 1,
            plural => 'bananas', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'orange' => {
            price => 9, weight => 2, nutrition => 80, time => 1,
            plural => 'oranges', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'melon' => {
            price => 10, weight => 5, nutrition => 100, time => 1,
            plural => 'melons', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'slime mold' => {
            price => 17, weight => 5, nutrition => 250, time => 1,
            plural => 'slime molds', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'fortune cookie' => {
            price => 7, weight => 1, nutrition => 40, time => 1,
            plural => 'fortune cookies', stackable => 1, material => 'veggy',
            vegan => 0, vegetarian => 1,
        },
        'candy bar' => {
            price => 10, weight => 2, nutrition => 100, time => 1,
            plural => 'candy bars', stackable => 1, material => 'veggy',
            vegan => 0, vegetarian => 1,
        },
        'cream pie' => {
            price => 10, weight => 10, nutrition => 100, time => 1,
            plural => 'cream pies', stackable => 1, material => 'veggy',
            vegan => 0, vegetarian => 1,
        },
        'lump of royal jelly' => {
            price => 15, weight => 2, nutrition => 200, time => 1,
            plural => 'lumps of royal jelly', stackable => 1,
            material => 'veggy',
            vegan => 0, vegetarian => 1,
        },
        'pancake' => {
            price => 15, weight => 2, nutrition => 200, time => 2,
            plural => 'pancakes', stackable => 1, material => 'veggy',
            vegan => 0, vegetarian => 1,
        },
        'C-ration' => {
            price => 20, weight => 10, nutrition => 300, time => 1,
            plural => 'C-rations', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'K-ration' => {
            price => 25, weight => 10, nutrition => 400, time => 1,
            plural => 'K-rations', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'cram ration' => {
            price => 35, weight => 15, nutrition => 600, time => 3,
            plural => 'cram rations', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'food ration' => {
            price => 45, weight => 20, nutrition => 800, time => 5,
            plural => 'food rations', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'lembas wafer' => {
            price => 45, weight => 5, nutrition => 800, time => 2,
            plural => 'lembas wafers', stackable => 1, material => 'veggy',
            vegan => 1, vegetarian => 1,
        },
        'empty tin' => {
            price => 5, weight => 10, nutrition => 0,
            plural => 'empty tins', stackable => 1, material => 'metal',
            appearance => 'tin',
            vegan => 1, vegetarian => 1,
        },
        'tin of spinach' => {
            price => 5, weight => 10, nutrition => 800,
            plural => 'tins of spinach', stackable => 1, material => 'metal',
            appearance => 'tin',
            vegan => 1, vegetarian => 1,
        },
    };

    for my $monster (NetHack::Monster::Spoiler->list) {
        next if $monster->never_drops_corpse;

        my $monster_name = $monster->name;
        my $item = $monster_name;
        if ($monster->is_unique) {
            $item .= ($item =~ /s$/ ? "'" : "'s");
            $item = "the " . $item unless $monster->has_proper_name;
        }

        my $corpse_name = "$item corpse";
        (my $corpse_plural = $corpse_name) =~ s/corpse$/corpses/;
        my $tin_name = "tin of $monster_name";
        $tin_name .= ' meat' unless $monster->vegetarian;
        (my $tin_plural = $tin_name) =~ s/^tin/tins/;
        my $egg_name = "$item egg";
        (my $egg_plural = $egg_name) =~ s/egg$/eggs/;

        $food->{$corpse_name} = {
            nutrition  => $monster->corpse_nutrition,
            plural     => $corpse_plural,
            appearance => $corpse_name,
            weight     => $monster->weight,
            stackable  => 1,
            material   => 'flesh',
            subtype    => 'corpse',
            price      => 5,
            monster    => $monster,
            permanent  => ($monster_name eq 'lizard'
                        || $monster_name eq 'lichen'),
            vegan      => $monster->vegan,
            vegetarian => $monster->vegetarian,
            time       => 3 + ($monster->weight >> 6),
            reanimates => $monster->corpse_reanimates,
            %{ $monster->corpse },
        };

        $food->{$tin_name} = {
            plural     => $tin_plural,
            appearance => 'tin',
            weight     => 10,
            stackable  => 1,
            material   => 'metal',
            price      => 5,
            monster    => $monster,
            vegan      => $monster->vegan,
            vegetarian => $monster->vegetarian,
            %{ $monster->corpse },
        };

        if ($monster->lays_eggs) {
            $food->{$egg_name} = {
                nutrition  => 80,
                plural     => $egg_plural,
                appearance => 'egg',
                weight     => 1,
                stackable  => 1,
                material   => 'flesh',
                price      => 9,
                monster    => $monster,
                vegan      => 0,
                vegetarian => 0,
                time       => 1,
                vomit      => 1,
            };
            $food->{$egg_name}{petrify} = 1 if $monster->touch_petrifies;
        }
    }

    return $food, (glyph => '%');
}

sub extra_plurals {
    return {
        tin => 'tins',
        egg => 'eggs',
    };
}

1;