コード例 #1
0
ファイル: resist.c プロジェクト: MarvinPA/mpa-poschengband
int res_ct_known(int which)
{
    int ct = p_ptr->resist[which];
    int hidden = 0;
    int flg = res_get_object_flag(which);
    int i;

    /* Life is a bit hard at the moment since "player flags"
       may account for multiple resistances. Really, the entire
       flag based approach to resistance is just wrong, but I'm
       too lazy to fix ...
    */
    for (i = 0; i < equip_count(); i++)
    {
        int          slot = EQUIP_BEGIN + i;
        object_type *o_ptr = equip_obj(slot);
        u32b         flgs[TR_FLAG_SIZE];
        u32b         flgs_known[TR_FLAG_SIZE];

        if (!o_ptr) continue;
        object_flags(o_ptr, flgs);
        object_flags_known(o_ptr, flgs_known);

        if (have_flag(flgs, flg) && !have_flag(flgs_known, flg))
            hidden++;
    }

    ct -= hidden;
    return ct;
}
コード例 #2
0
static void _character_dump(FILE* fff)
{
    int i;
    fprintf(fff, "\n\n=================================== Essences ==================================\n");
    fprintf(fff, "\n   %-22.22s Total  Need Bonus\n", "Stats");
    fprintf(fff, "   ---------------------- ----- ----- -----\n");
    for (i = 0; i < 6; i++) /* Assume in order */
        _dump_bonus_flag(fff, TR_STR + i, 3, 1, stat_name_true[A_STR + i]);

    fprintf(fff, "\n   %-22.22s Total  Need Bonus\n", "Skills");
    fprintf(fff, "   ---------------------- ----- ----- -----\n");
    _dump_bonus_flag(fff, _ESSENCE_TO_HIT, 1, 1, "To Hit");
    _dump_bonus_flag(fff, _ESSENCE_TO_DAM, 1, 1, "To Dam");
    _dump_bonus_flag(fff, _ESSENCE_AC, 2, 10, "To AC");
    _dump_bonus_flag(fff, TR_STEALTH, 2, 1, "Stealth");
    _dump_bonus_flag(fff, TR_SPEED, 1, 10, "Speed");
    if (_essences[TR_BLOWS])
    {
        int blows = _calc_amount(_essences[TR_BLOWS], _rank_decay(32), 1);

        blows = blows * _blows_mult();
        fprintf(fff, "   %-22.22s %5d %5d %5.5s\n", 
            "Attacks",
            _essences[TR_BLOWS], 
            _calc_needed(_essences[TR_BLOWS], _rank_decay(32), 1),
            blows ? format("+%d.%2.2d", blows / 100, blows % 100) : ""
        );
    }
    _dump_bonus_flag(fff, _ESSENCE_XTRA_DICE, _rank_decay(64), 1, "Slaying");
    _dump_bonus_flag(fff, TR_LIFE, 7, 1, "Life");
    _dump_bonus_flag(fff, TR_SEARCH, 2, 1, "Searching");
    _dump_bonus_flag(fff, TR_INFRA, 2, 1, "Infravision");
    _dump_bonus_flag(fff, TR_TUNNEL, 2, 1, "Digging");
    _dump_bonus_flag(fff, TR_MAGIC_MASTERY, 2, 1, "Magic Mastery");
    _dump_bonus_flag(fff, TR_LITE, 1, 1, "Light");
 
    fprintf(fff, "\n   %-22.22s Total  Need Bonus\n", "Slays");
    fprintf(fff, "   ---------------------- ----- ----- -----\n");
    for (i = 0; ; i++)
    {
        int j = _slay_flag_info[i].flag;
        if (j < 0) break;
        _dump_ability_flag(fff, j, _slay_power(i), _slay_flag_info[i].name);
    }

    fprintf(fff, "\n   %-22.22s Total  Need Bonus\n", "Resistances");
    fprintf(fff, "   ---------------------- ----- ----- -----\n");
    for (i = 0; i < RES_MAX; i++)
        _dump_bonus_flag(fff, res_get_object_flag(i), _res_power(i), 1, format("%^s", res_name(i)));

    _dump_ability_flag(fff, TR_IM_ACID, 3, "Immune Acid");
    _dump_ability_flag(fff, TR_IM_ELEC, 3, "Immune Elec");
    _dump_ability_flag(fff, TR_IM_FIRE, 3, "Immune Fire");
    _dump_ability_flag(fff, TR_IM_COLD, 3, "Immune Cold");

    fprintf(fff, "\n   %-22.22s Total  Need Bonus\n", "Abilities");
    fprintf(fff, "   ---------------------- ----- ----- -----\n");
    _dump_ability_flag(fff, TR_FREE_ACT, 2, "Free Action");
    _dump_ability_flag(fff, TR_SEE_INVIS, 3, "See Invisible");
    _dump_ability_flag(fff, TR_SLOW_DIGEST, 2, "Slow Digestion");
    _dump_ability_flag(fff, TR_REGEN, 7, "Regeneration");
    _dump_ability_flag(fff, TR_NO_MAGIC, 5, "Antimagic");
    _dump_ability_flag(fff, TR_REFLECT, 3, "Reflection");
    _dump_ability_flag(fff, TR_SH_FIRE, 7, "Aura Fire");
    _dump_ability_flag(fff, TR_SH_ELEC, 7, "Aura Elec");
    _dump_ability_flag(fff, TR_SH_COLD, 7, "Aura Cold");
    for (i = 0; i < 6; i++) /* Assume in order */
        _dump_ability_flag(fff, TR_SUST_STR + i, 5, format("Sustain %s", stat_name_true[A_STR + i]));

    fprintf(fff, "\n   %-22.22s Total  Need Bonus\n", "ESP");
    fprintf(fff, "   ---------------------- ----- ----- -----\n");
    _dump_ability_flag(fff, TR_TELEPATHY, 2, "Telepathy");
    _dump_ability_flag(fff, TR_ESP_ANIMAL, 2, "ESP Animals");
    _dump_ability_flag(fff, TR_ESP_UNDEAD, 2, "ESP Undead");
    _dump_ability_flag(fff, TR_ESP_DEMON, 2, "ESP Demon");
    _dump_ability_flag(fff, TR_ESP_ORC, 2, "ESP Orc");
    _dump_ability_flag(fff, TR_ESP_TROLL, 2, "ESP Troll");
    _dump_ability_flag(fff, TR_ESP_GIANT, 2, "ESP Giant");
    _dump_ability_flag(fff, TR_ESP_DRAGON, 2, "ESP Dragon");
    _dump_ability_flag(fff, TR_ESP_HUMAN, 2, "ESP Human");
    _dump_ability_flag(fff, TR_ESP_EVIL, 2, "ESP Evil");
    _dump_ability_flag(fff, TR_ESP_GOOD, 2, "ESP Good");
    _dump_ability_flag(fff, TR_ESP_NONLIVING, 2, "ESP Nonliving");
    _dump_ability_flag(fff, TR_ESP_UNIQUE, 2, "ESP Unique");
}
コード例 #3
0
static void _get_flags(u32b flgs[TR_FLAG_SIZE]) 
{
    int i;

    add_flag(flgs, TR_SPEED);
    add_flag(flgs, TR_LITE);
    add_flag(flgs, TR_RES_BLIND);
    add_flag(flgs, TR_RES_POIS);
    add_flag(flgs, TR_HOLD_LIFE);
    add_flag(flgs, TR_LEVITATION);

    for (i = 0; i < 6; i++) /* Assume in order */
    {
        if (i != 0) /* Bug: Giving TR_STR marks the player as cursed ... */
            _add_stat_flag(TR_STR + i, flgs);
        if (_essences[TR_SUST_STR + i] >= 5)
            add_flag(flgs, TR_SUST_STR + i);
    }

    for (i = 0; i < RES_MAX; i++)
    {
        int j = res_get_object_flag(i);
        int n = _calc_amount(_essences[j], _res_power(i), 1);

        if (n)
            add_flag(flgs, j);
    }

    if (_calc_amount(_essences[TR_STEALTH], 2, 1))
        add_flag(flgs, TR_STEALTH);
    if (_calc_amount(_essences[TR_MAGIC_MASTERY], 2, 1))
        add_flag(flgs, TR_MAGIC_MASTERY);
    if (_calc_amount(_essences[TR_SEARCH], 2, 1))
        add_flag(flgs, TR_SEARCH);
    if (_calc_amount(_essences[TR_INFRA], 2, 1))
        add_flag(flgs, TR_INFRA);
    if (_calc_amount(_essences[TR_TUNNEL], 2, 1))
        add_flag(flgs, TR_TUNNEL);

    if (_essences[TR_TELEPATHY] >= 2)
        add_flag(flgs, TR_TELEPATHY);

    for (i = TR_ESP_ANIMAL; i <= TR_ESP_UNIQUE; i++)
    {
        if (_essences[i] >= 2)
            add_flag(flgs, i);
    }

    if (_essences[TR_NO_MAGIC] >= 5)
        add_flag(flgs, TR_NO_MAGIC);
    if (_essences[TR_FREE_ACT] >= 2)
        add_flag(flgs, TR_FREE_ACT);
    if (_essences[TR_SEE_INVIS] >= 3)
        add_flag(flgs, TR_SEE_INVIS);
    if (_essences[TR_SLOW_DIGEST] >= 2)
        add_flag(flgs, TR_SLOW_DIGEST);
    if (_essences[TR_REGEN] >= 7)
        add_flag(flgs, TR_REGEN);
    if (_essences[TR_REFLECT] >= 3)
        add_flag(flgs, TR_REFLECT);

    if (_essences[TR_SH_FIRE] >= 7)
        add_flag(flgs, TR_SH_FIRE);
    if (_essences[TR_SH_ELEC] >= 7)
        add_flag(flgs, TR_SH_ELEC);
    if (_essences[TR_SH_COLD] >= 7)
        add_flag(flgs, TR_SH_COLD);
}
コード例 #4
0
static void _calc_bonuses(void) 
{
    int i;
    int l = p_ptr->lev;
    int to_a = l + l*l/50 + l*l*l/2500;

    to_a += _calc_amount(_essences[_ESSENCE_AC], 2, 10);
    if (p_ptr->current_r_idx == MON_DEATH_SCYTHE)
        to_a -= 50;
    p_ptr->to_a += to_a;
    p_ptr->dis_to_a += to_a;

    p_ptr->pspeed += 1;
    
    p_ptr->levitation = TRUE;
    p_ptr->no_cut = TRUE;
    res_add(RES_BLIND);
    res_add(RES_POIS);
    p_ptr->hold_life = TRUE;

    if (p_ptr->lev >= 10)
        p_ptr->pspeed += 1;

    if (p_ptr->lev >= 25)
        p_ptr->pspeed += 1;

    if (p_ptr->lev >= 35)
        p_ptr->pspeed += 2;

    if (p_ptr->lev >= 45)
    {
        p_ptr->pspeed += 2;
        p_ptr->sh_retaliation = TRUE;
    }

    for (i = 0; i < 6; i++) /* Assume in order */
        p_ptr->stat_add[A_STR + i] += _calc_stat_bonus(TR_STR + i);

    for (i = 0; i < RES_MAX; i++)
    {
        int j = res_get_object_flag(i);
        int n = _calc_amount(_essences[j], _res_power(i), 1);

        for (; n; --n)
            res_add(i);
    }
    if (_essences[TR_IM_ACID] >= 3)
        res_add_immune(RES_ACID);
    if (_essences[TR_IM_ELEC] >= 3)
        res_add_immune(RES_ELEC);
    if (_essences[TR_IM_FIRE] >= 3)
        res_add_immune(RES_FIRE);
    if (_essences[TR_IM_COLD] >= 3)
        res_add_immune(RES_COLD);

    p_ptr->life += 3*_calc_amount(_essences[TR_LIFE], 7, 1);

    p_ptr->skills.stl += _calc_amount(_essences[TR_STEALTH], 2, 1);
    p_ptr->pspeed += _calc_amount(_essences[TR_SPEED], 1, 10);
    p_ptr->skills.dev += 8*_calc_amount(_essences[TR_MAGIC_MASTERY], 2, 1);
    p_ptr->device_power += _calc_amount(_essences[TR_DEVICE_POWER], 2, 1);
    p_ptr->skills.srh += 5*_calc_amount(_essences[TR_SEARCH], 2, 1);
    p_ptr->skills.fos += 5*_calc_amount(_essences[TR_SEARCH], 2, 1);
    p_ptr->see_infra += _calc_amount(_essences[TR_INFRA], 2, 1);
    p_ptr->skill_dig += 20*_calc_amount(_essences[TR_TUNNEL], 2, 1);

    if (_essences[TR_SUST_STR] >= 5)
        p_ptr->sustain_str = TRUE;
    if (_essences[TR_SUST_INT] >= 5)
        p_ptr->sustain_int = TRUE;
    if (_essences[TR_SUST_WIS] >= 5)
        p_ptr->sustain_wis = TRUE;
    if (_essences[TR_SUST_DEX] >= 5)
        p_ptr->sustain_dex = TRUE;
    if (_essences[TR_SUST_CON] >= 5)
        p_ptr->sustain_con = TRUE;
    if (_essences[TR_SUST_CHR] >= 5)
        p_ptr->sustain_chr = TRUE;

    if (_essences[TR_TELEPATHY] >= 2)
        p_ptr->telepathy = TRUE;
    if (_essences[TR_ESP_ANIMAL] >= 2)
        p_ptr->esp_animal = TRUE;
    if (_essences[TR_ESP_UNDEAD] >= 2)
        p_ptr->esp_undead = TRUE;
    if (_essences[TR_ESP_DEMON] >= 2)
        p_ptr->esp_demon = TRUE;
    if (_essences[TR_ESP_ORC] >= 2)
        p_ptr->esp_orc = TRUE;
    if (_essences[TR_ESP_TROLL] >= 2)
        p_ptr->esp_troll = TRUE;
    if (_essences[TR_ESP_GIANT] >= 2)
        p_ptr->esp_giant = TRUE;
    if (_essences[TR_ESP_DRAGON] >= 2)
        p_ptr->esp_dragon = TRUE;
    if (_essences[TR_ESP_HUMAN] >= 2)
        p_ptr->esp_human = TRUE;
    if (_essences[TR_ESP_EVIL] >= 2)
        p_ptr->esp_evil = TRUE;
    if (_essences[TR_ESP_GOOD] >= 2)
        p_ptr->esp_good = TRUE;
    if (_essences[TR_ESP_NONLIVING] >= 2)
        p_ptr->esp_nonliving = TRUE;
    if (_essences[TR_ESP_UNIQUE] >= 2)
        p_ptr->esp_unique = TRUE;

    if (_essences[TR_NO_MAGIC] >= 5)
        p_ptr->anti_magic = TRUE;
    if (_essences[TR_FREE_ACT] >= 2)
        p_ptr->free_act = TRUE;
    if (_essences[TR_SEE_INVIS] >= 3)
        p_ptr->see_inv = TRUE;
    if (_essences[TR_SLOW_DIGEST] >= 2)
        p_ptr->slow_digest = TRUE;
    if (_essences[TR_REGEN] >= 7)
        p_ptr->regenerate = TRUE;
    if (_essences[TR_REFLECT] >= 3)
        p_ptr->reflect = TRUE;

    if (_essences[TR_SH_FIRE] >= 7)
        p_ptr->sh_fire = TRUE;
    if (_essences[TR_SH_ELEC] >= 7)
        p_ptr->sh_elec = TRUE;
    if (_essences[TR_SH_COLD] >= 7)
        p_ptr->sh_cold = TRUE;
}