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; }
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"); }
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); }
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; }