OSDN Git Service

[Fix] #39526 update_gambling_monsters() 中のゼロ除算を回避するよう修正. / Fix division by zero in...
[hengbandforosx/hengbandosx.git] / src / bldg.c
index fcac9d7..1d44aa2 100644 (file)
@@ -53,6 +53,7 @@
 #include "player-effects.h"
 #include "player-class.h"
 #include "player-personality.h"
+#include "player-inventory.h"
 #include "scores.h"
 #include "shoot.h"
 #include "view-mainwindow.h"
@@ -1428,12 +1429,12 @@ static bool gamble_comm(int cmd)
                        {
                                msg_print(_("「今回は儲けたな!でも次はこっちが勝ってやるからな、絶対に!」",
                                                        "You came out a winner! We'll win next time, I'm sure."));
-                               chg_virtue(V_CHANCE, 3);
+                               chg_virtue(p_ptr, V_CHANCE, 3);
                        }
                        else
                        {
                                msg_print(_("「金をスッてしまったな、わはは!うちに帰った方がいいぜ。」", "You lost gold! Haha, better head home."));
-                               chg_virtue(V_CHANCE, -3);
+                               chg_virtue(p_ptr, V_CHANCE, -3);
                        }
                }
                msg_print(NULL);
@@ -1455,7 +1456,7 @@ void update_gambling_monsters(void)
        bool tekitou;
        bool old_inside_battle = p_ptr->phase_out;
 
-       for (i = 0; i < max_d_idx; i++)
+       for (i = 0; i < current_world_ptr->max_d_idx; i++)
                if (max_dl < max_dlv[i]) max_dl = max_dlv[i];
 
        mon_level = randint1(MIN(max_dl, 122)) + 5;
@@ -1530,11 +1531,11 @@ void update_gambling_monsters(void)
                        if (r_ptr->flagsr & RFR_RES_ALL) power[i] *= 100000;
                        if (r_ptr->arena_ratio) power[i] = power[i] * r_ptr->arena_ratio / 100;
 
-
                        total += power[i];
                }
                for (i = 0; i < 4; i++)
                {
+                       if (power[i] <= 0) break;
                        power[i] = total * 60 / power[i];
                        if (tekitou && ((power[i] < 160) || power[i] > 1500)) break;
                        if ((power[i] < 160) && randint0(20)) break;
@@ -1937,7 +1938,7 @@ static bool kankin(void)
                                inven_item_increase(i, -o_ptr->number);
                                inven_item_describe(i);
                                inven_item_optimize(i);
-                               chg_virtue(V_JUSTICE, 5);
+                               chg_virtue(p_ptr, V_JUSTICE, 5);
                                current_world_ptr->bounty_r_idx[j] += 10000;
 
                                change = TRUE;
@@ -1948,7 +1949,7 @@ static bool kankin(void)
                                inven_item_describe(i);
                                inven_item_optimize(i);
 
-                               chg_virtue(V_JUSTICE, 5);
+                               chg_virtue(p_ptr, V_JUSTICE, 5);
                                current_world_ptr->bounty_r_idx[j] += 10000;
 
                                /* Count number of unique corpses already handed */
@@ -1960,7 +1961,7 @@ static bool kankin(void)
 
                                /* Prepare to make a prize */
                                object_prep(&forge, lookup_kind(prize_list[num-1].tval, prize_list[num-1].sval));
-                               apply_magic(&forge, current_floor_ptr->object_level, AM_NO_FIXED_ART);
+                               apply_magic(&forge, p_ptr->current_floor_ptr->object_level, AM_NO_FIXED_ART);
 
                                object_aware(&forge);
                                object_known(&forge);
@@ -2033,9 +2034,9 @@ static bool inn_comm(int cmd)
 
                                extract_day_hour_min(&prev_day, &prev_hour, &prev_min);
                                if ((prev_hour >= 6) && (prev_hour <= 17)) 
-                                       do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("宿屋に泊まった。", "stay over daytime at the inn."));
+                                       exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("宿屋に泊まった。", "stay over daytime at the inn."));
                                else
-                                       do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("宿屋に泊まった。", "stay over night at the inn."));
+                                       exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("宿屋に泊まった。", "stay over night at the inn."));
                                
                                current_world_ptr->game_turn = (current_world_ptr->game_turn / (TURNS_PER_TICK * TOWN_DAWN / 2) + 1) * (TURNS_PER_TICK * TOWN_DAWN / 2);
                                if (current_world_ptr->dungeon_turn < current_world_ptr->dungeon_turn_limit)
@@ -2046,7 +2047,7 @@ static bool inn_comm(int cmd)
 
                                prevent_turn_overflow();
 
-                               if ((prev_hour >= 18) && (prev_hour <= 23)) do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL);
+                               if ((prev_hour >= 18) && (prev_hour <= 23)) exe_write_diary(p_ptr, NIKKI_HIGAWARI, 0, NULL);
                                p_ptr->chp = p_ptr->mhp;
 
                                if (ironman_nightmare)
@@ -2056,12 +2057,12 @@ static bool inn_comm(int cmd)
                                        /* Have some nightmares */
                                        while(1)
                                        {
-                                               sanity_blast(NULL, FALSE);
+                                               sanity_blast(p_ptr, NULL, FALSE);
                                                if (!one_in_(3)) break;
                                        }
 
                                        msg_print(_("あなたは絶叫して目を覚ました。", "You awake screaming."));
-                                       do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("悪夢にうなされてよく眠れなかった。", "be troubled by a nightmare."));
+                                       exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("悪夢にうなされてよく眠れなかった。", "be troubled by a nightmare."));
                                }
                                else
                                {
@@ -2086,12 +2087,12 @@ static bool inn_comm(int cmd)
                                        if ((prev_hour >= 6) && (prev_hour <= 17))
                                        {
                                                msg_print(_("あなたはリフレッシュして目覚め、夕方を迎えた。", "You awake refreshed for the evening."));
-                                               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("夕方を迎えた。", "awake refreshed."));
+                                               exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("夕方を迎えた。", "awake refreshed."));
                                        }
                                        else
                                        {
                                                msg_print(_("あなたはリフレッシュして目覚め、新たな日を迎えた。", "You awake refreshed for the new day."));
-                                               do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("すがすがしい朝を迎えた。", "awake refreshed."));
+                                               exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("すがすがしい朝を迎えた。", "awake refreshed."));
                                        }
                                }
                        }
@@ -2169,7 +2170,7 @@ static void castle_quest(void)
        clear_bldg(4, 18);
 
        /* Current quest of the building */
-       q_index = current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].special;
+       q_index = p_ptr->current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].special;
 
        /* Is there a quest available at the building? */
        if (!q_index)
@@ -2661,7 +2662,7 @@ static PRICE compare_weapons(PRICE bcost)
        q = _("第一の武器は?", "What is your first weapon? ");
        s = _("比べるものがありません。", "You have nothing to compare.");
 
-       o_ptr[0] = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | IGNORE_BOTHHAND_SLOT), 0);
+       o_ptr[0] = choose_object(p_ptr, &item, q, s, (USE_EQUIP | USE_INVEN | IGNORE_BOTHHAND_SLOT), 0);
        if (!o_ptr[0])
        {
                screen_load();
@@ -2732,7 +2733,7 @@ static PRICE compare_weapons(PRICE bcost)
                        s = _("比べるものがありません。", "You have nothing to compare.");
 
                        /* Get the second weapon */
-                       o_ptr[1] = choose_object(&item2, q, s, (USE_EQUIP | USE_INVEN | IGNORE_BOTHHAND_SLOT), 0);
+                       o_ptr[1] = choose_object(p_ptr, &item2, q, s, (USE_EQUIP | USE_INVEN | IGNORE_BOTHHAND_SLOT), 0);
                        if (!o_ptr[1]) continue;
 
                        total += cost;
@@ -2922,7 +2923,7 @@ static PRICE repair_broken_weapon_aux(PRICE bcost)
        /* Only forge broken weapons */
        item_tester_hook = item_tester_hook_broken_weapon;
 
-       o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_EQUIP), 0);
+       o_ptr = choose_object(p_ptr, &item, q, s, (USE_INVEN | USE_EQUIP), 0);
        if (!o_ptr) return (0);
 
        /* It is worthless */
@@ -2949,7 +2950,7 @@ static PRICE repair_broken_weapon_aux(PRICE bcost)
        /* Only forge broken weapons */
        item_tester_hook = item_tester_hook_orthodox_melee_weapons;
 
-       mo_ptr = choose_object(&mater, q, s, (USE_INVEN | USE_EQUIP), 0);
+       mo_ptr = choose_object(p_ptr, &mater, q, s, (USE_INVEN | USE_EQUIP), 0);
        if (!mo_ptr) return (0);
        if (mater == item)
        {
@@ -3185,7 +3186,7 @@ static bool enchant_item(PRICE cost, HIT_PROB to_hit, HIT_POINT to_dam, ARMOUR_C
        q = _("どのアイテムを改良しますか?", "Improve which item? ");
        s = _("改良できるものがありません。", "You have nothing to improve.");
 
-       o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_EQUIP | IGNORE_BOTHHAND_SLOT), item_tester_tval);
+       o_ptr = choose_object(p_ptr, &item, q, s, (USE_INVEN | USE_EQUIP | IGNORE_BOTHHAND_SLOT), item_tester_tval);
        if (!o_ptr) return (FALSE);
 
        /* Check if the player has enough money */
@@ -3298,7 +3299,7 @@ static void building_recharge(void)
        q = _("どのアイテムに魔力を充填しますか? ", "Recharge which item? ");
        s = _("魔力を充填すべきアイテムがない。", "You have nothing to recharge.");
 
-       o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR), 0);
+       o_ptr = choose_object(p_ptr, &item, q, s, (USE_INVEN | USE_FLOOR), 0);
        if (!o_ptr) return;
 
        k_ptr = &k_info[o_ptr->k_idx];
@@ -3818,7 +3819,6 @@ static bool research_mon(void)
                        /* Normal commands */
                        if (query != 'r') break;
 
-                       /* Toggle recall */
                        recall = !recall;
                }
 
@@ -3966,13 +3966,13 @@ static void bldg_process_command(building_type *bldg, int i)
                paid = ident_spell(FALSE);
                break;
        case BACT_LEARN:
-               do_cmd_study();
+               do_cmd_study(p_ptr);
                break;
        case BACT_HEALING: /* needs work */
-               paid = cure_critical_wounds(200);
+               paid = cure_critical_wounds(p_ptr, 200);
                break;
        case BACT_RESTORE: /* needs work */
-               paid = restore_all_status();
+               paid = restore_all_status(p_ptr);
                break;
        case BACT_ENCHANT_ARROWS:
                item_tester_hook = item_tester_hook_ammo;
@@ -4028,25 +4028,25 @@ static void bldg_process_command(building_type *bldg, int i)
 
        case BACT_HEIKOUKA:
                msg_print(_("平衡化の儀式を行なった。", "You received an equalization ritual."));
-               set_virtue(V_COMPASSION, 0);
-               set_virtue(V_HONOUR, 0);
-               set_virtue(V_JUSTICE, 0);
-               set_virtue(V_SACRIFICE, 0);
-               set_virtue(V_KNOWLEDGE, 0);
-               set_virtue(V_FAITH, 0);
-               set_virtue(V_ENLIGHTEN, 0);
-               set_virtue(V_ENCHANT, 0);
-               set_virtue(V_CHANCE, 0);
-               set_virtue(V_NATURE, 0);
-               set_virtue(V_HARMONY, 0);
-               set_virtue(V_VITALITY, 0);
-               set_virtue(V_UNLIFE, 0);
-               set_virtue(V_PATIENCE, 0);
-               set_virtue(V_TEMPERANCE, 0);
-               set_virtue(V_DILIGENCE, 0);
-               set_virtue(V_VALOUR, 0);
-               set_virtue(V_INDIVIDUALISM, 0);
-               get_virtues();
+               set_virtue(p_ptr, V_COMPASSION, 0);
+               set_virtue(p_ptr, V_HONOUR, 0);
+               set_virtue(p_ptr, V_JUSTICE, 0);
+               set_virtue(p_ptr, V_SACRIFICE, 0);
+               set_virtue(p_ptr, V_KNOWLEDGE, 0);
+               set_virtue(p_ptr, V_FAITH, 0);
+               set_virtue(p_ptr, V_ENLIGHTEN, 0);
+               set_virtue(p_ptr, V_ENCHANT, 0);
+               set_virtue(p_ptr, V_CHANCE, 0);
+               set_virtue(p_ptr, V_NATURE, 0);
+               set_virtue(p_ptr, V_HARMONY, 0);
+               set_virtue(p_ptr, V_VITALITY, 0);
+               set_virtue(p_ptr, V_UNLIFE, 0);
+               set_virtue(p_ptr, V_PATIENCE, 0);
+               set_virtue(p_ptr, V_TEMPERANCE, 0);
+               set_virtue(p_ptr, V_DILIGENCE, 0);
+               set_virtue(p_ptr, V_VALOUR, 0);
+               set_virtue(p_ptr, V_INDIVIDUALISM, 0);
+               get_virtues(p_ptr);
                paid = TRUE;
                break;
 
@@ -4091,7 +4091,7 @@ void do_cmd_bldg(void)
                return;
        }
 
-       which = f_info[current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat].subtype;
+       which = f_info[p_ptr->current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat].subtype;
 
        bldg = &building[which];
 
@@ -4105,7 +4105,7 @@ void do_cmd_bldg(void)
        }
        else if ((which == 2) && p_ptr->inside_arena)
        {
-               if (!p_ptr->exit_bldg && current_floor_ptr->m_cnt > 0)
+               if (!p_ptr->exit_bldg && p_ptr->current_floor_ptr->m_cnt > 0)
                {
                        prt(_("ゲートは閉まっている。モンスターがあなたを待っている!", "The gates are closed.  The monster awaits!"), 0, 0);
                }
@@ -4148,7 +4148,7 @@ void do_cmd_bldg(void)
                p_ptr->oldpx = p_ptr->x;
        }
 
-       forget_lite();
+       forget_lite(p_ptr->current_floor_ptr);
        forget_view();
 
        /* Hack -- Increase "icky" depth */
@@ -4197,7 +4197,7 @@ void do_cmd_bldg(void)
                handle_stuff();
        }
 
-       select_floor_music();
+       select_floor_music(p_ptr);
 
        msg_flag = FALSE;
        msg_erase();
@@ -4232,7 +4232,7 @@ void determine_today_mon(bool conv_old)
 
        if (!conv_old)
        {
-               for (i = 0; i < max_d_idx; i++)
+               for (i = 0; i < current_world_ptr->max_d_idx; i++)
                {
                        if (max_dlv[i] < d_info[i].mindepth) continue;
                        if (max_dl < max_dlv[i]) max_dl = max_dlv[i];