X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fbldg.c;h=6d3621f0ed12d3fd94253b45eef28342018557f6;hb=57f8ef6e42a487dc2af160c8f28a9caf956b223c;hp=f602ee849028fab51624276f67b55ee18cd88933;hpb=15ba2993c4f24b100736a98cd4c2d9c911878241;p=hengband%2Fhengband.git diff --git a/src/bldg.c b/src/bldg.c index f602ee849..6d3621f0e 100644 --- a/src/bldg.c +++ b/src/bldg.c @@ -13,7 +13,7 @@ */ #include "angband.h" - +#include "object-hook.h" /*! * ループ中で / hack as in leave_store in store.c @@ -241,7 +241,7 @@ static void arena_comm(int cmd) msg_print(NULL); if (get_check(_("挑戦するかね?", "Do you fight? "))) { - msg_print(_("死ぬがよい。", "Die, maggots.")); + msg_print(_("死ぬがよい。", "Die, maggots.")); msg_print(NULL); p_ptr->exit_bldg = FALSE; @@ -299,6 +299,11 @@ static void arena_comm(int cmd) r_ptr = &r_info[arena_info[p_ptr->arena_number].r_idx]; name = (r_name + r_ptr->name); msg_format(_("%s に挑戦するものはいないか?", "Do I hear any challenges against: %s"), name); + + p_ptr->monster_race_idx = arena_info[p_ptr->arena_number].r_idx; + p_ptr->window |= (PW_MONSTER); + window_stuff(); + } break; case BACT_ARENA_RULES: @@ -492,13 +497,14 @@ static bool yaku_check_flush(void) } /*! - * @brief ポーカーの手札がストレート役を得ているかを帰す。 - * @return 役の判定結果 + * @brief ポーカーの手札がストレートを含んだ高位の役を得ているかを帰す。 + * @return 役の判定結果 0…ストレート、フラッシュいずれもなし/1…ストレートのみ/2…ストレートフラッシュ/3…ロイヤルストレートフラッシュ */ static int yaku_check_straight(void) { int i, lowest = 99; bool joker_is_used = FALSE; + bool straight = FALSE; /* get lowest */ for (i = 0; i < 5; i++) @@ -507,6 +513,7 @@ static int yaku_check_straight(void) lowest = NUM_OF(cards[i]); } + /* Check Royal Straight Flush */ if (yaku_check_flush()) { if( lowest == 0 ){ @@ -519,33 +526,51 @@ static int yaku_check_straight(void) break; } } - if (i == 4) return 3; /* Wow! Royal Flush!!! */ + if (i == 4) return 3; /* Wow! Royal Straight Flush!!! */ } - if( lowest == 9 ){ + if(lowest == 9){ for (i = 0; i < 3; i++) { if (!find_card_num(10 + i)) break; } - if (i == 3 && have_joker()) return 3; /* Wow! Royal Flush!!! */ + if (i == 3 && have_joker()) return 3; /* Wow! Royal Straight Flush!!! */ } } joker_is_used = FALSE; + + /* Straight Only Check */ + + if (lowest == 0) { /* (10 - J - Q - K)[JOKER] - A */ + for (i = 0; i < 4; i++) + { + if (!find_card_num(9 + i)) { + if (have_joker() && !joker_is_used) + joker_is_used = TRUE; + else + break; /* None */ + } + } + if(i == 4) straight = TRUE; + } + + joker_is_used = FALSE; + for (i = 0; i < 5; i++) { - if (!find_card_num(lowest + i)){ - if( have_joker() && !joker_is_used ) - joker_is_used = TRUE; - else - return 0; + if(!find_card_num(lowest + i)){ + if( have_joker() && !joker_is_used ) + joker_is_used = TRUE; + else + break; /* None */ } } + if(i == 5) straight = TRUE; - if (yaku_check_flush()) - return 2; /* Straight Flush */ - - return 1; + if (straight && yaku_check_flush()) return 2; /* Straight Flush */ + else if(straight) return 1; /* Only Straight */ + else return 0; } /*! @@ -650,7 +675,7 @@ static int yaku_check(void) c_put_str(TERM_YELLOW, _("フォーカード", "Four of a kind"), 4, 3); return ODDS_4C; case 7: - if (!NUM_OF(cards[0]) || !NUM_OF(cards[1])) + if (!NUM_OF(cards[0]) && !NUM_OF(cards[1])) { c_put_str(TERM_YELLOW, _("ファイブエース", "Five ace"), 4, 3); return ODDS_5A; @@ -980,7 +1005,7 @@ static int do_poker(void) cards[4] = 51; #endif #if 0 - /* debug:Straight */ + /* debug:Straight1 */ cards[0] = 1; cards[1] = 0 + 13; cards[2] = 3; @@ -988,6 +1013,54 @@ static int do_poker(void) cards[4] = 4; #endif #if 0 + /* debug:Straight2 */ + cards[0] = 12; + cards[1] = 0; + cards[2] = 9; + cards[3] = 11 + 13 * 2; + cards[4] = 10; +#endif +#if 0 + /* debug:Straight3 */ + cards[0] = 52; + cards[1] = 0; + cards[2] = 9; + cards[3] = 11 + 13 * 2; + cards[4] = 10; +#endif +#if 0 + /* debug:Straight4 */ + cards[0] = 12; + cards[1] = 52; + cards[2] = 9; + cards[3] = 11 + 13 * 2; + cards[4] = 10; +#endif +#if 0 + /* debug:Straight5 */ + cards[0] = 4; + cards[1] = 5 + 13; + cards[2] = 6; + cards[3] = 7 + 26; + cards[4] = 3; +#endif +#if 0 + /* debug:Five Card1 */ + cards[0] = 4; + cards[1] = 52; + cards[2] = 4 + 13; + cards[3] = 4 + 26; + cards[4] = 4 + 39; +#endif +#if 0 + /* debug:Five Card2 */ + cards[1] = 52; + cards[0] = 4; + cards[2] = 4 + 13; + cards[3] = 4 + 26; + cards[4] = 4 + 39; +#endif +#if 0 /* debug */ cards[0] = 52; cards[1] = 0; @@ -1365,10 +1438,10 @@ static bool gamble_comm(int cmd) * 自爆以外のなんらかのHP攻撃手段を持っていること。 * @return 参加できるか否か */ -static bool vault_aux_battle(int r_idx) +static bool vault_aux_battle(MONRACE_IDX r_idx) { int i; - int dam = 0; + HIT_POINT dam = 0; monster_race *r_ptr = &r_info[r_idx]; @@ -1390,7 +1463,7 @@ static bool vault_aux_battle(int r_idx) if (r_ptr->blow[i].method == RBM_EXPLODE) return (FALSE); if (r_ptr->blow[i].effect != RBE_DR_MANA) dam += r_ptr->blow[i].d_dice; } - if (!dam && !(r_ptr->flags4 & (RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_BREATH_MASK)) && !(r_ptr->flags5 & (RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_BREATH_MASK)) && !(r_ptr->flags6 & (RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_BREATH_MASK))) return (FALSE); + if (!dam && !(r_ptr->flags4 & (RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_BREATH_MASK)) && !(r_ptr->a_ability_flags1 & (RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_BREATH_MASK)) && !(r_ptr->a_ability_flags2 & (RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_BREATH_MASK))) return (FALSE); /* Okay */ return (TRUE); @@ -1428,9 +1501,10 @@ void battle_monsters(void) { total = 0; tekitou = FALSE; - for(i=0;i<4;i++) + for(i = 0; i < 4; i++) { - int r_idx, j; + MONRACE_IDX r_idx; + int j; while (1) { get_mon_num_prep(vault_aux_battle, NULL); @@ -1470,139 +1544,20 @@ void battle_monsters(void) power[i] = power[i] * (r_ptr->speed - 20) / 100; if (num_taisei > 2) power[i] = power[i] * (num_taisei*2+5) / 10; - else if (r_ptr->flags6 & RF6_INVULNER) + else if (r_ptr->a_ability_flags2 & RF6_INVULNER) power[i] = power[i] * 4 / 3; - else if (r_ptr->flags6 & RF6_HEAL) + else if (r_ptr->a_ability_flags2 & RF6_HEAL) power[i] = power[i] * 4 / 3; - else if (r_ptr->flags5 & RF5_DRAIN_MANA) + else if (r_ptr->a_ability_flags1 & RF5_DRAIN_MANA) power[i] = power[i] * 11 / 10; if (r_ptr->flags1 & RF1_RAND_25) power[i] = power[i] * 9 / 10; if (r_ptr->flags1 & RF1_RAND_50) power[i] = power[i] * 9 / 10; + if (r_ptr->flagsr & RFR_RES_ALL) power[i] *= 100000; + if (r_ptr->arena_ratio) power[i] = power[i] * r_ptr->arena_ratio / 100; + - switch (battle_mon[i]) - { - case MON_GREEN_G: - case MON_THAT_BAT: - case MON_GHOST_Q: - power[i] /= 4; - break; - case MON_LOST_SOUL: - case MON_GHOST: - power[i] /= 2; - break; - case MON_UND_BEHOLDER: - case MON_SANTACLAUS: - case MON_ULT_BEHOLDER: - case MON_UNGOLIANT: - case MON_ATLACH_NACHA: - case MON_Y_GOLONAC: - power[i] = power[i] * 3 / 5; - break; - case MON_ROBIN_HOOD: - case MON_RICH: - case MON_LICH: - case MON_COLOSSUS: - case MON_CRYPT_THING: - case MON_MASTER_LICH: - case MON_DREADMASTER: - case MON_DEMILICH: - case MON_SHADOWLORD: - case MON_ARCHLICH: - case MON_BLEYS: - case MON_CAINE: - case MON_JULIAN: - case MON_VENOM_WYRM: - case MON_MASTER_MYS: - case MON_G_MASTER_MYS: - power[i] = power[i] * 3 / 4; - break; - case MON_VORPAL_BUNNY: - case MON_SHAGRAT: - case MON_GORBAG: - case MON_LOG_MASTER: - case MON_JURT: - case MON_GRAV_HOUND: - case MON_SHIM_VOR: - case MON_JUBJUB: - case MON_CLUB_DEMON: - case MON_LLOIGOR: - case MON_NIGHTCRAWLER: - case MON_NIGHTWALKER: - case MON_RAPHAEL: - case MON_SHAMBLER: - case MON_SKY_DRAKE: - case MON_GERARD: - case MON_G_CTHULHU: - case MON_SPECT_WYRM: - case MON_BAZOOKER: - case MON_GCWADL: - case MON_KIRIN: - case MON_FENGHUANG: - power[i] = power[i] * 4 / 3; - break; - case MON_UMBER_HULK: - case MON_FIRE_VOR: - case MON_WATER_VOR: - case MON_COLD_VOR: - case MON_ENERGY_VOR: - case MON_GACHAPIN: - case MON_REVENANT: - case MON_NEXUS_VOR: - case MON_PLASMA_VOR: - case MON_TIME_VOR: - case MON_MANDOR: - case MON_KAVLAX: - case MON_RINALDO: - case MON_STORMBRINGER: - case MON_TIME_HOUND: - case MON_PLASMA_HOUND: - case MON_TINDALOS: - case MON_CHAOS_VOR: - case MON_AETHER_VOR: - case MON_AETHER_HOUND: - case MON_CANTORAS: - case MON_GODZILLA: - case MON_TARRASQUE: - case MON_DESTROYER: - case MON_MORGOTH: - case MON_SERPENT: - case MON_OROCHI: - case MON_D_ELF_SHADE: - case MON_MANA_HOUND: - case MON_SHARD_VOR: - case MON_BANORLUPART: - case MON_BOTEI: - case MON_JAIAN: - case MON_BAHAMUT: - case MON_WAHHA: - power[i] = power[i] * 3 / 2; - break; - case MON_ROLENTO: - case MON_CYBER: - case MON_CYBER_KING: - case MON_UNICORN_ORD: - power[i] = power[i] * 5 / 3; - break; - case MON_ARCH_VILE: - case MON_PHANTOM_B: - case MON_WYRM_POWER: - power[i] *= 2; - break; - case MON_NODENS: - case MON_CULVERIN: - power[i] *= 3; - break; - case MON_ECHIZEN: - power[i] *= 9; - break; - case MON_HAGURE: - power[i] *= 100000; - break; - default: - break; - } total += power[i]; } for (i=0;i<4;i++) @@ -1761,9 +1716,9 @@ static void today_target(void) c_put_str(TERM_YELLOW, _("本日の賞金首", "Wanted monster that changes from day to day"), 5, 10); sprintf(buf,_("ターゲット: %s", "target: %s"),r_name + r_ptr->name); c_put_str(TERM_YELLOW, buf, 6, 10); - sprintf(buf,_("死体 ---- $%d", "corpse ---- $%d"),r_ptr->level * 50 + 100); + sprintf(buf,_("死体 ---- $%d", "corpse ---- $%d"), (int)r_ptr->level * 50 + 100); prt(buf, 8, 10); - sprintf(buf,_("骨 ---- $%d", "skeleton ---- $%d"),r_ptr->level * 30 + 60); + sprintf(buf,_("骨 ---- $%d", "skeleton ---- $%d"), (int)r_ptr->level * 30 + 60); prt(buf, 9, 10); p_ptr->today_mon = today_mon; } @@ -1831,8 +1786,8 @@ static void shoukinkubi(void) * 賞金首の報酬テーブル / List of prize object */ static struct { - s16b tval; - s16b sval; + OBJECT_TYPE_VALUE tval; /*!< ベースアイテムのメイン種別ID */ + OBJECT_SUBTYPE_VALUE sval; /*!< ベースアイテムのサブ種別ID */ } prize_list[MAX_KUBI] = { {TV_POTION, SV_POTION_CURING}, @@ -2072,7 +2027,7 @@ static bool kankin(void) * @param r_idx 判定対象となるモンスターのID * @return 悪夢の元凶となり得るか否か。 */ -bool get_nightmare(int r_idx) +bool get_nightmare(MONRACE_IDX r_idx) { monster_race *r_ptr = &r_info[r_idx]; @@ -2087,236 +2042,6 @@ bool get_nightmare(int r_idx) } /*! - * @brief 悪夢モード時に睡眠/麻痺に陥った際のEldritchHorror処理 - * @param r_idx 狂気の元凶となるモンスターのID - * @return なし - * @todo 重複関数あり、要リファクタリング。 - */ -void have_nightmare(int r_idx) -{ - bool happened = FALSE; - monster_race *r_ptr = &r_info[r_idx]; - int power = r_ptr->level + 10; - char m_name[80]; - cptr desc = r_name + r_ptr->name; - - /* Describe it */ -#ifndef JP - if (!(r_ptr->flags1 & RF1_UNIQUE)) - sprintf(m_name, "%s %s", (is_a_vowel(desc[0]) ? "an" : "a"), desc); - else -#endif - sprintf(m_name, "%s", desc); - - if (!(r_ptr->flags1 & RF1_UNIQUE)) - { - if (r_ptr->flags1 & RF1_FRIENDS) power /= 2; - } - else power *= 2; - - if (saving_throw(p_ptr->skill_sav * 100 / power)) - { - msg_format(_("夢の中で%sに追いかけられた。", "%^s chases you through your dreams."), m_name); - /* Safe */ - return; - } - - if (p_ptr->image) - { - /* Something silly happens... */ - msg_format(_("%s%sの顔を見てしまった!", "You behold the %s visage of %s!"), - funny_desc[randint0(MAX_SAN_FUNNY)], m_name); - - if (one_in_(3)) - { - msg_print(funny_comments[randint0(MAX_SAN_COMMENT)]); - p_ptr->image = p_ptr->image + randint1(r_ptr->level); - } - - /* Never mind; we can't see it clearly enough */ - return; - } - - /* Something frightening happens... */ - msg_format(_("%s%sの顔を見てしまった!", "You behold the %s visage of %s!"), - horror_desc[randint0(MAX_SAN_HORROR)], desc); - - r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR; - - if (!p_ptr->mimic_form) - { - switch (p_ptr->prace) - { - /* Demons may make a saving throw */ - case RACE_IMP: - case RACE_DEMON: - if (saving_throw(20 + p_ptr->lev)) return; - break; - /* Undead may make a saving throw */ - case RACE_SKELETON: - case RACE_ZOMBIE: - case RACE_SPECTRE: - case RACE_VAMPIRE: - if (saving_throw(10 + p_ptr->lev)) return; - break; - } - } - else - { - /* Demons may make a saving throw */ - if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON) - { - if (saving_throw(20 + p_ptr->lev)) return; - } - /* Undead may make a saving throw */ - else if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_UNDEAD) - { - if (saving_throw(10 + p_ptr->lev)) return; - } - } - - /* Mind blast */ - if (!saving_throw(p_ptr->skill_sav * 100 / power)) - { - if (!p_ptr->resist_conf) - { - (void)set_confused(p_ptr->confused + randint0(4) + 4); - } - if (!p_ptr->resist_chaos && one_in_(3)) - { - (void)set_image(p_ptr->image + randint0(250) + 150); - } - return; - } - - /* Lose int & wis */ - if (!saving_throw(p_ptr->skill_sav * 100 / power)) - { - do_dec_stat(A_INT); - do_dec_stat(A_WIS); - return; - } - - /* Brain smash */ - if (!saving_throw(p_ptr->skill_sav * 100 / power)) - { - if (!p_ptr->resist_conf) - { - (void)set_confused(p_ptr->confused + randint0(4) + 4); - } - if (!p_ptr->free_act) - { - (void)set_paralyzed(p_ptr->paralyzed + randint0(4) + 4); - } - while (!saving_throw(p_ptr->skill_sav)) - { - (void)do_dec_stat(A_INT); - } - while (!saving_throw(p_ptr->skill_sav)) - { - (void)do_dec_stat(A_WIS); - } - if (!p_ptr->resist_chaos) - { - (void)set_image(p_ptr->image + randint0(250) + 150); - } - return; - } - - - /* Amnesia */ - if (!saving_throw(p_ptr->skill_sav * 100 / power)) - { - if (lose_all_info()) - { - msg_print(_("あまりの恐怖に全てのことを忘れてしまった!", "You forget everything in your utmost terror!")); - } - return; - } - - /* Else gain permanent insanity */ - if ((p_ptr->muta3 & MUT3_MORONIC) && (p_ptr->muta2 & MUT2_BERS_RAGE) && - ((p_ptr->muta2 & MUT2_COWARDICE) || (p_ptr->resist_fear)) && - ((p_ptr->muta2 & MUT2_HALLU) || (p_ptr->resist_chaos))) - { - /* The poor bastard already has all possible insanities! */ - return; - } - - while (!happened) - { - switch (randint1(4)) - { - case 1: - { - if (!(p_ptr->muta3 & MUT3_MORONIC)) - { - if ((p_ptr->stat_use[A_INT] < 4) && (p_ptr->stat_use[A_WIS] < 4)) - { - msg_print(_("あなたは完璧な馬鹿になったような気がした。しかしそれは元々だった。", "You turn into an utter moron!")); - } - else - { - msg_print(_("あなたは完璧な馬鹿になった!", "You turn into an utter moron!")); - } - - if (p_ptr->muta3 & MUT3_HYPER_INT) - { - msg_print(_("あなたの脳は生体コンピュータではなくなった。", "Your brain is no longer a living computer.")); - p_ptr->muta3 &= ~(MUT3_HYPER_INT); - } - p_ptr->muta3 |= MUT3_MORONIC; - happened = TRUE; - } - break; - } - case 2: - { - if (!(p_ptr->muta2 & MUT2_COWARDICE) && !p_ptr->resist_fear) - { - msg_print(_("あなたはパラノイアになった!", "You become paranoid!")); - - /* Duh, the following should never happen, but anyway... */ - if (p_ptr->muta3 & MUT3_FEARLESS) - { - msg_print(_("あなたはもう恐れ知らずではなくなった。", "You are no longer fearless.")); - p_ptr->muta3 &= ~(MUT3_FEARLESS); - } - - p_ptr->muta2 |= MUT2_COWARDICE; - happened = TRUE; - } - break; - } - case 3: - { - if (!(p_ptr->muta2 & MUT2_HALLU) && !p_ptr->resist_chaos) - { - msg_print(_("幻覚をひき起こす精神錯乱に陥った!", "You are afflicted by a hallucinatory insanity!")); - p_ptr->muta2 |= MUT2_HALLU; - happened = TRUE; - } - break; - } - default: - { - if (!(p_ptr->muta2 & MUT2_BERS_RAGE)) - { - msg_print(_("激烈な感情の発作におそわれるようになった!", "You become subject to fits of berserk rage!")); - p_ptr->muta2 |= MUT2_BERS_RAGE; - happened = TRUE; - } - break; - } - } - } - - p_ptr->update |= PU_BONUS; - handle_stuff(); -} - - -/*! * @brief 宿屋の利用サブルーチン * @details inn commands\n * Note that resting for the night was a perfect way to avoid player\n @@ -2360,10 +2085,10 @@ static bool inn_comm(int cmd) else do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("宿屋に泊まった。", "stay over night at the inn.")); - turn = (turn / (TURNS_PER_TICK*TOWN_DAWN/2) + 1) * (TURNS_PER_TICK*TOWN_DAWN/2); + turn = (turn / (TURNS_PER_TICK * TOWN_DAWN / 2) + 1) * (TURNS_PER_TICK * TOWN_DAWN / 2); if (dungeon_turn < dungeon_turn_limit) { - dungeon_turn += MIN(turn - oldturn, TURNS_PER_TICK * 250); + dungeon_turn += MIN((turn - oldturn), TURNS_PER_TICK * 250) * INN_DUNGEON_TURN_ADJ; if (dungeon_turn > dungeon_turn_limit) dungeon_turn = dungeon_turn_limit; } @@ -2376,20 +2101,13 @@ static bool inn_comm(int cmd) { msg_print(_("眠りに就くと恐ろしい光景が心をよぎった。", "Horrible visions flit through your mind as you sleep.")); - /* Pick a nightmare */ - get_mon_num_prep(get_nightmare, NULL); - /* Have some nightmares */ while(1) { - have_nightmare(get_mon_num(MAX_DEPTH)); - + sanity_blast(NULL, FALSE); if (!one_in_(3)) break; } - /* Remove the monster restriction */ - get_mon_num_prep(NULL, NULL); - msg_print(_("あなたは絶叫して目を覚ました。", "You awake screaming.")); do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("悪夢にうなされてよく眠れなかった。", "be troubled by a nightmare.")); } @@ -2405,7 +2123,7 @@ static bool inn_comm(int cmd) int i; for (i = 0; i < 72; i++) { - p_ptr->magic_num1[i] = p_ptr->magic_num2[i]*EATER_CHARGE; + p_ptr->magic_num1[i] = p_ptr->magic_num2[i] * EATER_CHARGE; } for (; i < 108; i++) { @@ -2444,13 +2162,12 @@ static bool inn_comm(int cmd) * @param do_init クエストの開始処理(TRUE)、結果処理か(FALSE) * @return なし */ -static void get_questinfo(int questnum, bool do_init) +static void get_questinfo(IDX questnum, bool do_init) { int i; - int old_quest; + IDX old_quest; char tmp_str[80]; - /* Clear the text */ for (i = 0; i < 10; i++) { @@ -2473,7 +2190,7 @@ static void get_questinfo(int questnum, bool do_init) p_ptr->inside_quest = old_quest; /* Print the quest info */ - sprintf(tmp_str, _("クエスト情報 (危険度: %d 階相当)", "Quest Information (Danger level: %d)"), quest[questnum].level); + sprintf(tmp_str, _("クエスト情報 (危険度: %d 階相当)", "Quest Information (Danger level: %d)"), (int)quest[questnum].level); prt(tmp_str, 5, 0); @@ -2491,7 +2208,7 @@ static void get_questinfo(int questnum, bool do_init) */ static void castle_quest(void) { - int q_index = 0; + IDX q_index = 0; monster_race *r_ptr; quest_type *q_ptr; cptr name; @@ -2500,7 +2217,7 @@ static void castle_quest(void) clear_bldg(4, 18); /* Current quest of the building */ - q_index = cave[py][px].special; + q_index = cave[p_ptr->y][p_ptr->x].special; /* Is there a quest available at the building? */ if (!q_index) @@ -2601,15 +2318,14 @@ static void town_history(void) /*! * @brief 射撃時クリティカルによるダメージ期待値修正計算(スナイパーの集中処理と武器経験値) / critical happens at i / 10000 - * @param weight 武器の重量 * @param plus_ammo 矢弾のダメージ修正 * @param plus_bow 弓のダメージ修正 - * @param dam 基本ダメージ量 * @return ダメージ期待値 + * @note 基本ダメージ量と重量はこの部位では計算に加わらない。 */ -s16b calc_crit_ratio_shot(int weight, int plus_ammo, int plus_bow, int dam) +HIT_POINT calc_crit_ratio_shot(HIT_POINT plus_ammo, HIT_POINT plus_bow) { - int i; + HIT_POINT i; object_type *j_ptr = &inventory[INVEN_BOW]; /* Extract "shot" power */ @@ -2640,11 +2356,11 @@ s16b calc_crit_ratio_shot(int weight, int plus_ammo, int plus_bow, int dam) * @param dam 基本ダメージ量 * @return ダメージ期待値 */ -s16b calc_expect_crit_shot(int weight, int plus_ammo, int plus_bow, int dam) +HIT_POINT calc_expect_crit_shot(int weight, int plus_ammo, int plus_bow, HIT_POINT dam) { u32b num; int i, k, crit; - i = calc_crit_ratio_shot(weight, plus_ammo, plus_bow, dam); + i = calc_crit_ratio_shot(plus_ammo, plus_bow); k = 0; num = 0; @@ -2682,7 +2398,7 @@ s16b calc_expect_crit_shot(int weight, int plus_ammo, int plus_bow, int dam) * @param dokubari 毒針処理か否か * @return ダメージ期待値 */ -s16b calc_expect_crit(int weight, int plus, int dam, s16b meichuu, bool dokubari) +HIT_POINT calc_expect_crit(int weight, int plus, HIT_POINT dam, s16b meichuu, bool dokubari) { u32b k, num; int i; @@ -2726,7 +2442,7 @@ s16b calc_expect_crit(int weight, int plus, int dam, s16b meichuu, bool dokubari * @param force 理力特別計算フラグ * @return ダメージ期待値 */ -static s16b calc_slaydam(int dam, int mult, int div, bool force) +static HIT_POINT calc_slaydam(HIT_POINT dam, int mult, int div, bool force) { int tmp; if(force) @@ -3039,7 +2755,7 @@ static int hit_chance(int to_h, int ac) if (chance > 95) chance = 95; if (chance < 5) chance = 5; if (p_ptr->pseikaku == SEIKAKU_NAMAKE) - chance = (chance*19+9)/20; + chance = (chance * 19 + 9) / 20; return chance; } @@ -3085,64 +2801,17 @@ static void list_weapon(object_type *o_ptr, int row, int col) /* Damage for one blow (if it hits) */ sprintf(tmp_str, _("攻撃一回につき %d-%d", "One Strike: %d-%d damage"), - eff_dd + o_ptr->to_d + p_ptr->to_d[0], - eff_ds * eff_dd + o_ptr->to_d + p_ptr->to_d[0]); + (int)(eff_dd + o_ptr->to_d + p_ptr->to_d[0]), + (int)(eff_ds * eff_dd + o_ptr->to_d + p_ptr->to_d[0])); put_str(tmp_str, row+6, col+1); /* Damage for the complete attack (if all blows hit) */ sprintf(tmp_str, _("1ターンにつき %d-%d", "One Attack: %d-%d damage"), - p_ptr->num_blow[0] * (eff_dd + o_ptr->to_d + p_ptr->to_d[0]), - p_ptr->num_blow[0] * (eff_ds * eff_dd + o_ptr->to_d + p_ptr->to_d[0])); + (int)(p_ptr->num_blow[0] * (eff_dd + o_ptr->to_d + p_ptr->to_d[0])), + (int)(p_ptr->num_blow[0] * (eff_ds * eff_dd + o_ptr->to_d + p_ptr->to_d[0]))); put_str(tmp_str, row+7, col+1); } - -/*! - * @brief 武器匠の「武器」鑑定対象になるかを判定する。/ Hook to specify "weapon" - * @param o_ptr オブジェクトの構造体の参照ポインタ。 - * @return 対象になるならTRUEを返す。 - */ -static bool item_tester_hook_melee_weapon(object_type *o_ptr) -{ - switch (o_ptr->tval) - { - case TV_HAFTED: - case TV_POLEARM: - case TV_DIGGING: - { - return (TRUE); - } - case TV_SWORD: - { - if (o_ptr->sval != SV_DOKUBARI) return (TRUE); - } - } - - return (FALSE); -} - - -/*! - * @brief 武器匠の「矢弾」鑑定対象になるかを判定する。/ Hook to specify "weapon" - * @param o_ptr オブジェクトの構造体の参照ポインタ。 - * @return 対象になるならTRUEを返す。 - */ -static bool item_tester_hook_ammo(object_type *o_ptr) -{ - switch (o_ptr->tval) - { - case TV_SHOT: - case TV_ARROW: - case TV_BOLT: - { - return (TRUE); - } - } - - return (FALSE); -} - - /*! * @brief 武器匠鑑定1回分(オブジェクト2種)の処理。/ Compare weapons * @details @@ -3155,7 +2824,7 @@ static bool item_tester_hook_ammo(object_type *o_ptr) static int compare_weapons(int bcost) { int i, n; - int item, item2; + OBJECT_IDX item, item2; object_type *o_ptr[2]; object_type orig_weapon; object_type *i_ptr; @@ -3179,7 +2848,7 @@ static int compare_weapons(int bcost) /* Only compare melee weapons */ item_tester_no_ryoute = TRUE; - item_tester_hook = item_tester_hook_melee_weapon; + item_tester_hook = item_tester_hook_orthodox_melee_weapons; /* Get the first weapon */ q = _("第一の武器は?", "What is your first weapon? "); @@ -3203,7 +2872,7 @@ static int compare_weapons(int bcost) /* Only compare melee weapons */ item_tester_no_ryoute = TRUE; - item_tester_hook = item_tester_hook_melee_weapon; + item_tester_hook = item_tester_hook_orthodox_melee_weapons; /* Hack -- prevent "icky" message */ character_xtra = TRUE; @@ -3385,24 +3054,6 @@ static bool eval_ac(int iAC) } -/*! - * @brief 修復対象となる壊れた武器かを判定する。 / Hook to specify "broken weapon" - * @param o_ptr オブジェクトの構造体の参照ポインタ。 - * @return 修復対象になるならTRUEを返す。 - */ -static bool item_tester_hook_broken_weapon(object_type *o_ptr) -{ - if (o_ptr->tval != TV_SWORD) return FALSE; - - switch (o_ptr->sval) - { - case SV_BROKEN_DAGGER: - case SV_BROKEN_SWORD: - return TRUE; - } - - return FALSE; -} /*! * @brief 修復材料のオブジェクトから修復対象に特性を移植する。 @@ -3468,10 +3119,11 @@ static void give_one_ability_of_object(object_type *to_ptr, object_type *from_pt static int repair_broken_weapon_aux(int bcost) { s32b cost; - int item, mater; + OBJECT_IDX item, mater; object_type *o_ptr, *mo_ptr; /* broken weapon and material weapon */ object_kind *k_ptr; - int i, k_idx, dd_bonus, ds_bonus; + int i, dd_bonus, ds_bonus; + IDX k_idx; char basenm[MAX_NLEN]; cptr q, s; /* For get_item prompt */ int row = 7; @@ -3518,7 +3170,7 @@ static int repair_broken_weapon_aux(int bcost) s = _("材料となる武器がありません。", "You have no material to repair."); /* Only forge broken weapons */ - item_tester_hook = item_tester_hook_melee_weapon; + item_tester_hook = item_tester_hook_orthodox_melee_weapons; if (!get_item(&mater, q, s, (USE_INVEN | USE_EQUIP))) return (0); if (mater == item) @@ -3551,24 +3203,25 @@ static int repair_broken_weapon_aux(int bcost) if (o_ptr->sval == SV_BROKEN_DAGGER) { - int i, n = 1; + IDX j; + int n = 1; /* Suppress compiler warning */ k_idx = 0; - for (i = 1; i < max_k_idx; i++) + for (j = 1; j < max_k_idx; j++) { - object_kind *k_ptr = &k_info[i]; + object_kind *k_aux_ptr = &k_info[j]; - if (k_ptr->tval != TV_SWORD) continue; - if ((k_ptr->sval == SV_BROKEN_DAGGER) || - (k_ptr->sval == SV_BROKEN_SWORD) || - (k_ptr->sval == SV_DOKUBARI)) continue; - if (k_ptr->weight > 99) continue; + if (k_aux_ptr->tval != TV_SWORD) continue; + if ((k_aux_ptr->sval == SV_BROKEN_DAGGER) || + (k_aux_ptr->sval == SV_BROKEN_SWORD) || + (k_aux_ptr->sval == SV_DOKUBARI)) continue; + if (k_aux_ptr->weight > 99) continue; if (one_in_(n)) { - k_idx = i; + k_idx = j; n++; } } @@ -3576,7 +3229,7 @@ static int repair_broken_weapon_aux(int bcost) else /* TV_BROKEN_SWORD */ { /* Repair to a sword or sometimes material's type weapon */ - int tval = (one_in_(5) ? mo_ptr->tval : TV_SWORD); + OBJECT_TYPE_VALUE tval = (one_in_(5) ? mo_ptr->tval : TV_SWORD); while(1) { @@ -3626,13 +3279,13 @@ static int repair_broken_weapon_aux(int bcost) /* Copy base object's ability */ for (i = 0; i < TR_FLAG_SIZE; i++) o_ptr->art_flags[i] |= k_ptr->flags[i]; if (k_ptr->pval) o_ptr->pval = MAX(o_ptr->pval, randint1(k_ptr->pval)); - if (have_flag(k_ptr->flags, TR_ACTIVATE)) o_ptr->xtra2 = k_ptr->act_idx; + if (have_flag(k_ptr->flags, TR_ACTIVATE)) o_ptr->xtra2 = (byte_hack)k_ptr->act_idx; /* Dice up */ if (dd_bonus > 0) { o_ptr->dd++; - for (i = 0; i < dd_bonus; i++) + for (i = 1; i < dd_bonus; i++) { if (one_in_(o_ptr->dd + i)) o_ptr->dd++; } @@ -3640,7 +3293,7 @@ static int repair_broken_weapon_aux(int bcost) if (ds_bonus > 0) { o_ptr->ds++; - for (i = 0; i < ds_bonus; i++) + for (i = 1; i < ds_bonus; i++) { if (one_in_(o_ptr->ds + i)) o_ptr->ds++; } @@ -3740,7 +3393,8 @@ static int repair_broken_weapon(int bcost) */ static bool enchant_item(int cost, int to_hit, int to_dam, int to_ac) { - int i, item; + int i; + OBJECT_IDX item; bool okay = FALSE; object_type *o_ptr; cptr q, s; @@ -3858,12 +3512,13 @@ static bool enchant_item(int cost, int to_hit, int to_dam, int to_ac) */ static void building_recharge(void) { - int item, lev; + OBJECT_IDX item; + int lev; object_type *o_ptr; object_kind *k_ptr; cptr q, s; int price; - int charges; + PARAMETER_VALUE charges; int max_charges; char tmp_str[MAX_NLEN]; @@ -4035,7 +3690,7 @@ if (get_check(format("そのロッドを$%d で再充填しますか?", max_charges = o_ptr->number * k_ptr->pval - o_ptr->pval; /* Get the quantity for staves and wands */ - charges = get_quantity(format(_("一回分$%d で何回分充填しますか?", "Add how many charges for %d gold? "), price), + charges = (PARAMETER_VALUE)get_quantity(format(_("一回分$%d で何回分充填しますか?", "Add how many charges for %d gold? "), price), MIN(p_ptr->au / price, max_charges)); /* Do nothing */ @@ -4302,7 +3957,9 @@ bool tele_town(void) */ static bool research_mon(void) { - int i, n, r_idx; + IDX i; + int n; + MONRACE_IDX r_idx; char sym, query; char buf[128]; @@ -4312,7 +3969,7 @@ static bool research_mon(void) u16b why = 0; - u16b *who; + IDX *who; /* XTRA HACK WHATSEARCH */ bool all = FALSE; @@ -4322,7 +3979,7 @@ static bool research_mon(void) /* XTRA HACK REMEMBER_IDX */ static int old_sym = '\0'; - static int old_i = 0; + static IDX old_i = 0; /* Save the screen */ @@ -4389,7 +4046,7 @@ static bool research_mon(void) /* Allocate the "who" array */ - C_MAKE(who, max_r_idx, u16b); + C_MAKE(who, max_r_idx, IDX); /* Collect matching monsters */ for (n = 0, i = 1; i < max_r_idx; i++) @@ -4421,7 +4078,7 @@ static bool research_mon(void) continue; } #endif - if (isupper(temp[xx])) temp[xx] = tolower(temp[xx]); + if (isupper(temp[xx])) temp[xx] = (char)tolower(temp[xx]); } #ifdef JP @@ -4430,7 +4087,7 @@ static bool research_mon(void) strcpy(temp2, r_name + r_ptr->name); #endif for (xx = 0; temp2[xx] && xx < 80; xx++) - if (isupper(temp2[xx])) temp2[xx] = tolower(temp2[xx]); + if (isupper(temp2[xx])) temp2[xx] = (char)tolower(temp2[xx]); #ifdef JP if (my_strstr(temp2, temp) || my_strstr(r_name + r_ptr->name, temp)) @@ -4446,7 +4103,7 @@ static bool research_mon(void) if (!n) { /* Free the "who" array */ - C_KILL(who, max_r_idx, u16b); + C_KILL(who, max_r_idx, IDX); /* Restore */ screen_load(); @@ -4554,7 +4211,7 @@ static bool research_mon(void) /* prt(buf, 5, 5);*/ /* Free the "who" array */ - C_KILL(who, max_r_idx, u16b); + C_KILL(who, max_r_idx, IDX); /* Restore */ screen_load(); @@ -4571,8 +4228,8 @@ static bool research_mon(void) */ static void bldg_process_command(building_type *bldg, int i) { - int bact = bldg->actions[i]; - int bcost; + BACT_IDX bact = bldg->actions[i]; + PRICE bcost; bool paid = FALSE; int amt; @@ -4683,21 +4340,10 @@ static void bldg_process_command(building_type *bldg, int i) do_cmd_study(); break; case BACT_HEALING: /* needs work */ - hp_player(200); - set_poisoned(0); - set_blind(0); - set_confused(0); - set_cut(0); - set_stun(0); - paid = TRUE; + paid = cure_critical_wounds(200); break; case BACT_RESTORE: /* needs work */ - if (do_res_stat(A_STR)) paid = TRUE; - if (do_res_stat(A_INT)) paid = TRUE; - if (do_res_stat(A_WIS)) paid = TRUE; - if (do_res_stat(A_DEX)) paid = TRUE; - if (do_res_stat(A_CON)) paid = TRUE; - if (do_res_stat(A_CHR)) paid = TRUE; + paid = restore_all_status(); break; case BACT_ENCHANT_ARROWS: item_tester_hook = item_tester_hook_ammo; @@ -4712,8 +4358,8 @@ static void bldg_process_command(building_type *bldg, int i) break; case BACT_TELEPORT_LEVEL: { - int select_dungeon; - int max_depth; + IDX select_dungeon; + DEPTH max_depth; clear_bldg(4, 20); select_dungeon = choose_dungeon(_("にテレポート", "teleport"), 4, 0); @@ -4729,7 +4375,7 @@ static void bldg_process_command(building_type *bldg, int i) else if(quest[QUEST_SERPENT].status != QUEST_STATUS_FINISHED) max_depth = 99; } amt = get_quantity(format(_("%sの何階にテレポートしますか?", "Teleport to which level of %s? "), - d_name + d_info[select_dungeon].name), max_depth); + d_name + d_info[select_dungeon].name), (QUANTITY)max_depth); if (amt > 0) { @@ -4823,9 +4469,9 @@ static void bldg_process_command(building_type *bldg, int i) */ void do_cmd_quest(void) { - energy_use = 100; + p_ptr->energy_use = 100; - if (!cave_have_flag_bold(py, px, FF_QUEST_ENTER)) + if (!cave_have_flag_bold(p_ptr->y, p_ptr->x, FF_QUEST_ENTER)) { msg_print(_("ここにはクエストの入口はない。", "You see no quest level here.")); return; @@ -4844,7 +4490,7 @@ void do_cmd_quest(void) leave_quest_check(); if (quest[p_ptr->inside_quest].type != QUEST_TYPE_RANDOM) dun_level = 1; - p_ptr->inside_quest = cave[py][px].special; + p_ptr->inside_quest = cave[p_ptr->y][p_ptr->x].special; p_ptr->leaving = TRUE; } @@ -4863,15 +4509,15 @@ void do_cmd_bldg(void) building_type *bldg; - energy_use = 100; + p_ptr->energy_use = 100; - if (!cave_have_flag_bold(py, px, FF_BLDG)) + if (!cave_have_flag_bold(p_ptr->y, p_ptr->x, FF_BLDG)) { msg_print(_("ここには建物はない。", "You see no building here.")); return; } - which = f_info[cave[py][px].feat].subtype; + which = f_info[cave[p_ptr->y][p_ptr->x].feat].subtype; bldg = &building[which]; @@ -4901,7 +4547,7 @@ void do_cmd_bldg(void) command_new = SPECIAL_KEY_BUILDING; /* No energy needed to re-enter the arena */ - energy_use = 0; + p_ptr->energy_use = 0; } return; @@ -4918,14 +4564,14 @@ void do_cmd_bldg(void) command_new = SPECIAL_KEY_BUILDING; /* No energy needed to re-enter the arena */ - energy_use = 0; + p_ptr->energy_use = 0; return; } else { - p_ptr->oldpy = py; - p_ptr->oldpx = px; + p_ptr->oldpy = p_ptr->y; + p_ptr->oldpx = p_ptr->x; } /* Forget the lite */ @@ -5084,15 +4730,15 @@ void quest_discovery(int q_idx) * @param level 検索対象になる階 * @return クエストIDを返す。該当がない場合0を返す。 */ -int quest_number(int level) +IDX quest_number(DEPTH level) { - int i; + IDX i; /* Check quests */ if (p_ptr->inside_quest) return (p_ptr->inside_quest); - for (i = 0; i < max_quests; i++) + for (i = 0; i < max_q_idx; i++) { if (quest[i].status != QUEST_STATUS_TAKEN) continue; @@ -5112,18 +4758,18 @@ int quest_number(int level) * @param level 検索対象になる階 * @return クエストIDを返す。該当がない場合0を返す。 */ -int random_quest_number(int level) +IDX random_quest_number(DEPTH level) { - int i; + IDX i; if (dungeon_type != DUNGEON_ANGBAND) return 0; for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++) { if ((quest[i].type == QUEST_TYPE_RANDOM) && - (quest[i].status == QUEST_STATUS_TAKEN) && - (quest[i].level == level) && - (quest[i].dungeon == DUNGEON_ANGBAND)) + (quest[i].status == QUEST_STATUS_TAKEN) && + (quest[i].level == level) && + (quest[i].dungeon == DUNGEON_ANGBAND)) { return i; }