OSDN Git Service

[Refactor] #37353 init1.c を dungeon-file.c、 init2.c を init.c として整理。
[hengband/hengband.git] / src / bldg.c
index 46e20b4..7e2d594 100644 (file)
 
 #include "angband.h"
 #include "floor.h"
+#include "floor-events.h"
+#include "floor-save.h"
+#include "object-boost.h"
+#include "object-flavor.h"
 #include "object-hook.h"
+#include "monster.h"
 #include "monsterrace-hook.h"
 #include "melee.h"
+#include "wild.h"
 #include "world.h"
 #include "sort.h"
 
 #include "avatar.h"
+#include "bldg.h"
 #include "mutation.h"
 #include "quest.h"
 #include "artifact.h"
 #include "rumor.h"
 #include "player-status.h"
 #include "spells-status.h"
+#include "realm-hex.h"
+#include "dungeon-file.h"
+
+/*!
+ * @brief 闘技場のモンスターID及び報酬アイテムテーブル
+ */
+const arena_type arena_info[MAX_ARENA_MONS + 2] =
+{
+       { MON_NOBORTA,       TV_AMULET, SV_AMULET_ADORNMENT           },
+       { MON_MORI_TROLL,    TV_FOOD,   SV_FOOD_PINT_OF_WINE          },
+       { MON_IMP,           TV_POTION, SV_POTION_SPEED               },
+       { MON_LION_HEART,    0,         0                             },
+       { MON_MASTER_YEEK,   TV_POTION, SV_POTION_CURING              },
+       { MON_SABRE_TIGER,   TV_WAND,   SV_WAND_STONE_TO_MUD          },
+       { MON_LIZARD_KING,   TV_WAND,   SV_WAND_TELEPORT_AWAY         },
+       { MON_WYVERN,        TV_POTION, SV_POTION_HEALING             },
+       { MON_ARCH_VILE,     TV_POTION, SV_POTION_RESISTANCE          },
+       { MON_ELF_LORD   ,   TV_POTION, SV_POTION_ENLIGHTENMENT       },
+       { MON_GHOUL_KING,    TV_FOOD,   SV_FOOD_RESTORING             },
+       { MON_COLBRAN,       TV_RING,   SV_RING_ELEC                  },
+       { MON_BICLOPS,       TV_WAND,   SV_WAND_ACID_BALL             },
+       { MON_M_MINDCRAFTER, TV_POTION, SV_POTION_SELF_KNOWLEDGE      },
+       { MON_GROO,          TV_SCROLL, SV_SCROLL_ACQUIREMENT         },
+       { MON_RAAL,          TV_SCROLL, SV_SCROLL_STAR_DESTRUCTION    },
+       { MON_DREADMASTER,   TV_WAND,   SV_WAND_HYPODYNAMIA            },
+       { MON_ULTRA_PALADIN, TV_STAFF,  SV_STAFF_DISPEL_EVIL          },
+       { MON_BARNEY,        TV_RING,   SV_RING_RES_CHAOS             },
+       { MON_TROLL_KING,    TV_SCROLL, SV_SCROLL_MASS_GENOCIDE       },
+       { MON_BARON_HELL,    TV_POTION, SV_POTION_AUGMENTATION        },
+       { MON_F_ANGEL,       TV_SCROLL, SV_SCROLL_RUNE_OF_PROTECTION  },
+       { MON_G_C_DRAKE,     TV_WAND,   SV_WAND_DRAGON_FIRE           },
+       { MON_IRON_LICH,     TV_STAFF,  SV_STAFF_DESTRUCTION          },
+       { MON_DROLEM,        TV_POTION, SV_POTION_STAR_HEALING        },
+       { MON_G_TITAN,       TV_WAND,   SV_WAND_GENOCIDE              },
+       { MON_G_BALROG,      TV_POTION, SV_POTION_EXPERIENCE          },
+       { MON_ELDER_VAMPIRE, TV_RING,   SV_RING_SUSTAIN               },
+       { MON_NIGHTWALKER,   TV_WAND,   SV_WAND_STRIKING              },
+       { MON_S_TYRANNO,     TV_SCROLL, SV_SCROLL_STAR_ACQUIREMENT    },
+       { MON_G_MASTER_MYS,  TV_ROD,    SV_ROD_IDENTIFY               },
+       { MON_LORD_CHAOS,    TV_POTION, SV_POTION_LIFE                },
+       { MON_SHADOWLORD,    TV_POTION, SV_POTION_STAR_ENLIGHTENMENT  },
+       { MON_ULT_BEHOLDER,  TV_AMULET, SV_AMULET_REFLECTION          },
+       { MON_JABBERWOCK,    TV_ROD,    SV_ROD_HEALING                },
+       { MON_LOCKE_CLONE,   TV_WAND,   SV_WAND_DISINTEGRATE          },
+       { MON_WYRM_SPACE,    TV_ROD,    SV_ROD_RESTORATION            },
+       { MON_SHAMBLER,      TV_SCROLL, SV_SCROLL_STAR_ACQUIREMENT    },
+       { MON_BLACK_REAVER,  TV_RING,   SV_RING_LORDLY                },
+       { MON_FENGHUANG,     TV_STAFF,  SV_STAFF_THE_MAGI             },
+       { MON_WYRM_POWER,    TV_SCROLL, SV_SCROLL_ARTIFACT            },
+       { 0,                 0,         0                             }, /* Victory prizing */
+       { MON_HAGURE,        TV_SCROLL, SV_SCROLL_ARTIFACT            },
+};
+
 
 /*!
  * ループ中で / hack as in leave_store in store.c
@@ -1353,10 +1413,10 @@ static bool gamble_comm(int cmd)
 }
 
 /*!
- * @brief モンスター闘技場に参加するモンスターをリセットする。
+ * @brief モンスター闘技場に参加するモンスターを更新する。
  * @return なし
  */
-void battle_monsters(void)
+void update_gambling_monsters(void)
 {
        int total, i;
        int max_dl = 0;
@@ -1368,15 +1428,15 @@ void battle_monsters(void)
        for (i = 0; i < max_d_idx; i++)
                if (max_dl < max_dlv[i]) max_dl = max_dlv[i];
 
-       mon_level = randint1(MIN(max_dl, 122))+5;
+       mon_level = randint1(MIN(max_dl, 122)) + 5;
        if (randint0(100) < 60)
        {
-               i = randint1(MIN(max_dl, 122))+5;
+               i = randint1(MIN(max_dl, 122)) + 5;
                mon_level = MAX(i, mon_level);
        }
        if (randint0(100) < 30)
        {
-               i = randint1(MIN(max_dl, 122))+5;
+               i = randint1(MIN(max_dl, 122)) + 5;
                mon_level = MAX(i, mon_level);
        }
 
@@ -1384,7 +1444,7 @@ void battle_monsters(void)
        {
                total = 0;
                tekitou = FALSE;
-               for(i = 0; i < 4; i++)
+               for (i = 0; i < 4; i++)
                {
                        MONRACE_IDX r_idx;
                        int j;
@@ -1402,8 +1462,8 @@ void battle_monsters(void)
                                }
 
                                for (j = 0; j < i; j++)
-                                       if(r_idx == battle_mon[j]) break;
-                               if (j<i) continue;
+                                       if (r_idx == battle_mon[j]) break;
+                               if (j < i) continue;
 
                                break;
                        }
@@ -1411,7 +1471,7 @@ void battle_monsters(void)
                        if (r_info[r_idx].level < 45) tekitou = TRUE;
                }
 
-               for (i=0;i<4;i++)
+               for (i = 0; i < 4; i++)
                {
                        monster_race *r_ptr = &r_info[battle_mon[i]];
                        int num_taisei = count_bits(r_ptr->flagsr & (RFR_IM_ACID | RFR_IM_ELEC | RFR_IM_FIRE | RFR_IM_COLD | RFR_IM_POIS));
@@ -1426,7 +1486,7 @@ void battle_monsters(void)
                        if (r_ptr->speed < 110)
                                power[i] = power[i] * (r_ptr->speed - 20) / 100;
                        if (num_taisei > 2)
-                               power[i] = power[i] * (num_taisei*2+5) / 10;
+                               power[i] = power[i] * (num_taisei * 2 + 5) / 10;
                        else if (r_ptr->a_ability_flags2 & RF6_INVULNER)
                                power[i] = power[i] * 4 / 3;
                        else if (r_ptr->a_ability_flags2 & RF6_HEAL)
@@ -1443,9 +1503,9 @@ void battle_monsters(void)
 
                        total += power[i];
                }
-               for (i=0;i<4;i++)
+               for (i = 0; i < 4; i++)
                {
-                       power[i] = total*60/power[i];
+                       power[i] = total * 60 / power[i];
                        if (tekitou && ((power[i] < 160) || power[i] > 1500)) break;
                        if ((power[i] < 160) && randint0(20)) break;
                        if (power[i] < 101) power[i] = 100 + randint1(5);
@@ -1461,15 +1521,15 @@ void battle_monsters(void)
  */
 static bool kakutoujou(void)
 {
-       s32b maxbet;
-       s32b wager;
+       PRICE maxbet;
+       PRICE wager;
        char out_val[160], tmp_str[80];
        concptr p;
 
-       if ((turn - old_battle) > TURNS_PER_TICK*250)
+       if ((current_world_ptr->game_turn - old_battle) > TURNS_PER_TICK * 250)
        {
-               battle_monsters();
-               old_battle = turn;
+               update_gambling_monsters();
+               old_battle = current_world_ptr->game_turn;
        }
 
        screen_save();
@@ -1520,9 +1580,9 @@ static bool kakutoujou(void)
                        else bell();
                }
 
-               clear_bldg(4,4);
-               for (i=0;i<4;i++)
-                       if (i !=sel_monster) clear_bldg(i+5,i+5);
+               clear_bldg(4, 4);
+               for (i = 0; i < 4; i++)
+                       if (i != sel_monster) clear_bldg(i + 5, i + 5);
 
                maxbet = p_ptr->lev * 200;
 
@@ -1637,9 +1697,9 @@ static void shoukinkubi(void)
        {
                byte color;
                concptr done_mark;
-               monster_race *r_ptr = &r_info[(kubi_r_idx[i] > 10000 ? kubi_r_idx[i] - 10000 : kubi_r_idx[i])];
+               monster_race *r_ptr = &r_info[(current_world_ptr->bounty_r_idx[i] > 10000 ? current_world_ptr->bounty_r_idx[i] - 10000 : current_world_ptr->bounty_r_idx[i])];
 
-               if (kubi_r_idx[i] > 10000)
+               if (current_world_ptr->bounty_r_idx[i] > 10000)
                {
                        color = TERM_RED;
                        done_mark = _("(済)", "(done)");
@@ -1829,7 +1889,7 @@ static bool kankin(void)
                for (i = INVEN_PACK-1; i >= 0; i--)
                {
                        o_ptr = &inventory[i];
-                       if ((o_ptr->tval == TV_CORPSE) && (o_ptr->pval == kubi_r_idx[j]))
+                       if ((o_ptr->tval == TV_CORPSE) && (o_ptr->pval == current_world_ptr->bounty_r_idx[j]))
                        {
                                char buf[MAX_NLEN+20];
                                int num, k;
@@ -1841,14 +1901,14 @@ static bool kankin(void)
                                if (!get_check(buf)) continue;
 
 #if 0 /* Obsoleted */
-                               msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (r_info[kubi_r_idx[j]].level + 1) * 300 * o_ptr->number);
-                               p_ptr->au += (r_info[kubi_r_idx[j]].level+1) * 300 * o_ptr->number;
+                               msg_format(_("賞金 %ld$を手に入れた。", "You get %ldgp."), (r_info[current_world_ptr->bounty_r_idx[j]].level + 1) * 300 * o_ptr->number);
+                               p_ptr->au += (r_info[current_world_ptr->bounty_r_idx[j]].level+1) * 300 * o_ptr->number;
                                p_ptr->redraw |= (PR_GOLD);
                                inven_item_increase(i, -o_ptr->number);
                                inven_item_describe(i);
                                inven_item_optimize(i);
                                chg_virtue(V_JUSTICE, 5);
-                               kubi_r_idx[j] += 10000;
+                               current_world_ptr->bounty_r_idx[j] += 10000;
 
                                change = TRUE;
 #endif /* Obsoleted */
@@ -1859,18 +1919,18 @@ static bool kankin(void)
                                inven_item_optimize(i);
 
                                chg_virtue(V_JUSTICE, 5);
-                               kubi_r_idx[j] += 10000;
+                               current_world_ptr->bounty_r_idx[j] += 10000;
 
                                /* Count number of unique corpses already handed */
                                for (num = 0, k = 0; k < MAX_KUBI; k++)
                                {
-                                       if (kubi_r_idx[k] >= 10000) num++;
+                                       if (current_world_ptr->bounty_r_idx[k] >= 10000) num++;
                                }
                                msg_format(_("これで合計 %d ポイント獲得しました。" ,"You earned %d point%s total."), num, (num > 1 ? "s" : ""));
 
                                /* Prepare to make a prize */
                                object_prep(&forge, lookup_kind(prize_list[num-1].tval, prize_list[num-1].sval));
-                               apply_magic(&forge, object_level, AM_NO_FIXED_ART);
+                               apply_magic(&forge, current_floor_ptr->object_level, AM_NO_FIXED_ART);
 
                                object_aware(&forge);
                                object_known(&forge);
@@ -1938,7 +1998,7 @@ static bool inn_comm(int cmd)
                        }
                        else
                        {
-                               s32b oldturn = turn;
+                               s32b oldturn = current_world_ptr->game_turn;
                                int prev_day, prev_hour, prev_min;
 
                                extract_day_hour_min(&prev_day, &prev_hour, &prev_min);
@@ -1947,11 +2007,11 @@ 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);
-                               if (dungeon_turn < dungeon_turn_limit)
+                               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)
                                {
-                                       dungeon_turn += MIN((turn - oldturn), TURNS_PER_TICK * 250) * INN_DUNGEON_TURN_ADJ;
-                                       if (dungeon_turn > dungeon_turn_limit) dungeon_turn = dungeon_turn_limit;
+                                       current_world_ptr->dungeon_turn += MIN((current_world_ptr->game_turn - oldturn), TURNS_PER_TICK * 250) * INN_DUNGEON_TURN_ADJ;
+                                       if (current_world_ptr->dungeon_turn > current_world_ptr->dungeon_turn_limit) current_world_ptr->dungeon_turn = current_world_ptr->dungeon_turn_limit;
                                }
 
                                prevent_turn_overflow();
@@ -2079,7 +2139,7 @@ static void castle_quest(void)
        clear_bldg(4, 18);
 
        /* Current quest of the building */
-       q_index = cave[p_ptr->y][p_ptr->x].special;
+       q_index = current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].special;
 
        /* Is there a quest available at the building? */
        if (!q_index)
@@ -3650,7 +3710,7 @@ bool tele_town(void)
        POSITION x, y;
        int num = 0;
 
-       if (dun_level)
+       if (current_floor_ptr->dun_level)
        {
                msg_print(_("この魔法は地上でしか使えない!", "This spell can only be used on the surface!"));
                return FALSE;
@@ -3671,7 +3731,7 @@ bool tele_town(void)
 
                if ((i == NO_TOWN) || (i == SECRET_TOWN) || (i == p_ptr->town_num) || !(p_ptr->visit & (1L << (i - 1)))) continue;
 
-               sprintf(buf, "%c) %-20s", I2A(i - 1), town[i].name);
+               sprintf(buf, "%c) %-20s", I2A(i - 1), town_info[i].name);
                prt(buf, 5 + i, 5);
                num++;
        }
@@ -3699,9 +3759,9 @@ bool tele_town(void)
                break;
        }
 
-       for (y = 0; y < max_wild_y; y++)
+       for (y = 0; y < current_world_ptr->max_wild_y; y++)
        {
-               for (x = 0; x < max_wild_x; x++)
+               for (x = 0; x < current_world_ptr->max_wild_x; x++)
                {
                        if(wilderness[y][x].town == (i-'a'+1))
                        {
@@ -3874,12 +3934,7 @@ static bool research_mon(void)
        /* Sort if needed */
        if (why)
        {
-               /* Select the sort method */
-               ang_sort_comp = ang_sort_comp_hook;
-               ang_sort_swap = ang_sort_swap_hook;
-
-               /* Sort the array */
-               ang_sort(who, &why, n);
+               ang_sort(who, &why, n, ang_sort_comp_hook, ang_sort_swap_hook);
        }
 
 
@@ -4192,7 +4247,7 @@ void do_cmd_quest(void)
 {
        if(p_ptr->wild_mode) return;
 
-       take_turn(p_ptr, 100);;
+       take_turn(p_ptr, 100);
 
        if (!cave_have_flag_bold(p_ptr->y, p_ptr->x, FF_QUEST_ENTER))
        {
@@ -4213,8 +4268,8 @@ 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[p_ptr->y][p_ptr->x].special;
+               if (quest[p_ptr->inside_quest].type != QUEST_TYPE_RANDOM) current_floor_ptr->dun_level = 1;
+               p_ptr->inside_quest = current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].special;
 
                p_ptr->leaving = TRUE;
        }
@@ -4234,7 +4289,7 @@ void do_cmd_bldg(void)
 
        if(p_ptr->wild_mode) return;
 
-       take_turn(p_ptr, 100);;
+       take_turn(p_ptr, 100);
 
        if (!cave_have_flag_bold(p_ptr->y, p_ptr->x, FF_BLDG))
        {
@@ -4242,7 +4297,7 @@ void do_cmd_bldg(void)
                return;
        }
 
-       which = f_info[cave[p_ptr->y][p_ptr->x].feat].subtype;
+       which = f_info[current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat].subtype;
 
        bldg = &building[which];