view xrogue/eat.c @ 210:c4f2e1bda8b0

arogue5: fix a typo that broke compilation with GCC 5. "msg" had been used instead of "msgw". I'm not sure why neither GCC 4 nor MSVC caught this.
author John "Elwin" Edwards
date Sun, 17 Jan 2016 18:59:50 -0500
parents e6179860cb76
children f54901b9c39b
line wrap: on
line source

/*
    eat.c  -  Functions for dealing with digestion

    XRogue: Expeditions into the Dungeons of Doom
    Copyright (C) 1991 Robert Pietkivitch
    All rights reserved.
    
    Based on "Advanced Rogue"
    Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
    All rights reserved.

    Based on "Rogue: Exploring the Dungeons of Doom"
    Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
    All rights reserved.
    
    See the file LICENSE.TXT for full copyright and licensing information.
*/

#include <curses.h>
#include "rogue.h"

/*
 * eat:
 *      He wants to eat something, so let him try
 */

eat()
{
    register struct linked_list *item;
    int which;
    unsigned long temp;

    if (player.t_action != C_EAT) {
        if ((item = get_item(pack, "eat", FOOD, FALSE, FALSE)) == NULL)
            return;

        player.t_using = item;  /* Remember what it is */
        player.t_action = C_EAT;        /* We are eating */
        which = (OBJPTR(item))->o_which;
        player.t_no_move = max(foods[which].mi_food/100, 1) * movement(&player);
        return;
    }

    /* We have waited our time, let's eat the food */
    item = player.t_using;
    player.t_using = NULL;
    player.t_action = A_NIL;

    which = (OBJPTR(item))->o_which;
    if ((food_left += foods[which].mi_food) > STOMACHSIZE)
        food_left = STOMACHSIZE;
    del_pack(item);
    if (hungry_state == F_SATIATED && food_left == STOMACHSIZE && rnd(4) == 1) {
        pstats.s_hpt = -1;
        msg ("Cough!  Ack!  You choke on all that food and die!  --More--");
        wait_for(' ');
        death(D_FOOD_CHOKE);
    }
    if (food_left >= STOMACHSIZE-MORETIME) {
        hungry_state = F_SATIATED;
        msg ("You have trouble getting that food down!");
        msg ("Your stomach feels like it's about to burst!");
    }
    else if (which != E_SLIMEMOLD) {
        hungry_state = F_OKAY;
        switch (rnd(10)) {
        case 0: msg("Yuck, what a foul tasting %s! ", foods[which].mi_name);
        when 1: msg("Mmmm, what a tasty %s. ", foods[which].mi_name);
        when 2: msg("Wow, what a scrumptious %s! ", foods[which].mi_name);
        when 3: msg("Hmmm, %s heaven! ", foods[which].mi_name);
        when 4: msg("You've eaten better %s. ", foods[which].mi_name);
        when 5: msg("You smack your lips ");
        when 6: msg("Yum-yum-yum ");
        when 7: msg("Gulp! ");
        when 8: msg("Your tongue flips out! ");
        when 9: msg("You lick your chin ");
        }
    }
    updpack(TRUE, &player);
    switch(which) {
    case E_WHORTLEBERRY:    /* add 1 to intelligence */
        (*add_abil[A_INTELLIGENCE])(1);
    when E_SWEETSOP:    /* add 1 to strength */
    case E_SOURSOP: /* add 1 to strength */
        (*add_abil[A_STRENGTH])(1);
    when E_SAPODILLA:   /* add 1 to wisdom */
        (*add_abil[A_WISDOM])(1);
    when E_APPLE:   /* add 1 to dexterity */
        (*add_abil[A_DEXTERITY])(1);
    when E_PRICKLEY:    /* add 1 to constitution */
        (*add_abil[A_CONSTITUTION])(1);
    when E_PEACH:   /* add 1 to charisma */
        (*add_abil[A_CHARISMA])(1);
    when E_PITANGA: /* add 1 hit point */
        max_stats.s_hpt++;
        pstats.s_hpt = max_stats.s_hpt;
        msg("You feel a bit tougher now. ");
    when E_HAGBERRY:    /* armor class */
    case E_JABOTICABA:  /* armor class */
        pstats.s_arm--;
        msg("Your skin feels more resilient now. ");
    when E_STRAWBERRY:  /* add 10% experience points */
    case E_RAMBUTAN:    /* add 10% experience points */
        temp = pstats.s_exp/100 + 10;
        pstats.s_exp += temp;
        msg("You feel slightly more experienced now. ");
        check_level();
    when E_DEWBERRY:    /* encourage him to do more magic */
        if (chant_time > 0) {
            chant_time -= 80;
            if (chant_time < 0)
                chant_time = 0;
            msg("You feel you have more chant ability. ");
        }
        if (pray_time > 0) {
            pray_time -= 80;
            if (pray_time < 0)
                pray_time = 0;
            msg("You feel you have more prayer ability. ");
        }
        if (spell_power > 0) {
            spell_power -= 80;
            if (spell_power < 0)
                spell_power = 0;
            msg("You feel you have more spell casting ability. ");
        }
    when E_CANDLEBERRY: /* cure him */
        if (on(player, HASINFEST) || 
            on(player, HASDISEASE)|| 
            on(player, DOROT)) {
            if (on(player, HASDISEASE)) {
                extinguish(cure_disease);
                cure_disease();
            }
            if (on(player, HASINFEST)) {
                msg("You feel yourself improving. ");
                turn_off(player, HASINFEST);
                infest_dam = 0;
            }
            if (on(player, DOROT)) {
                msg("You feel your skin returning to normal. ");
                turn_off(player, DOROT);
            }
        }
    when E_SLIMEMOLD: /* monster food */
    msg("The slime-mold quivers around in your mouth. ");
        player.t_no_move = 3*movement(&player);
        if (off(player, HASDISEASE)) {
            if (ISWEARING(R_HEALTH) || player.t_ctype == C_PALADIN ||
                player.t_ctype == C_RANGER) {
        msg("You feel lousy. ");
            }
            else {
                turn_on(player, HASDISEASE);
                fuse(cure_disease, (VOID *)NULL, roll(HEALTIME,SICKTIME),AFTER);
                msg("You become ill. ");
            }
    }
        pstats.s_const -= rnd(2)+1;
    if (pstats.s_const <= 3) pstats.s_const = 3;
    
    otherwise: /* not all the foods have to do something */
        break;
    }
}