#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
}
/*!
- * @brief モンスター闘技場に参加するモンスターをリセットする。
+ * @brief モンスター闘技場に参加するモンスターを更新する。
* @return なし
*/
-void battle_monsters(void)
+void update_gambling_monsters(void)
{
int total, i;
int max_dl = 0;
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);
}
{
total = 0;
tekitou = FALSE;
- for(i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
{
MONRACE_IDX r_idx;
int j;
}
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;
}
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));
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)
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);
*/
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();
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;
{
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)");
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;
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 */
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);
}
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);
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();
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)
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;
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++;
}
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))
{
/* 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);
}
{
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))
{
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;
}
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))
{
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];