*/
#include "angband.h"
+#include "floor.h"
#include "object-hook.h"
+#include "monsterrace-hook.h"
#include "melee.h"
+#include "world.h"
+#include "sort.h"
+#include "mutation.h"
/*!
* ループ中で / hack as in leave_store in store.c
static void arena_comm(int cmd)
{
monster_race *r_ptr;
- cptr name;
+ concptr name;
switch (cmd)
int i, j;
char suitcolor[4] = {TERM_YELLOW, TERM_L_RED, TERM_L_BLUE, TERM_L_GREEN};
#ifdef JP
- cptr suit[4] = {"★", "●", "¶", "†"};
- cptr card_grph[13][7] = {{"A %s ",
+ concptr suit[4] = {"★", "●", "¶", "†"};
+ concptr card_grph[13][7] = {{"A %s ",
" 変 ",
" 愚 ",
" 蛮 ",
" υ ∂ ",
" σ ノ %s",
" K"}};
- cptr joker_grph[7] = { " ",
+ concptr joker_grph[7] = { " ",
" J ",
" O ",
" K ",
#else
- cptr suit[4] = {"[]", "qp", "<>", "db"};
- cptr card_grph[13][7] = {{"A %s ",
+ concptr suit[4] = {"[]", "qp", "<>", "db"};
+ concptr card_grph[13][7] = {{"A %s ",
" He ",
" ng ",
" ba ",
" c & ",
" v__/ %s",
" K"}};
- cptr joker_grph[7] = { " ",
+ concptr joker_grph[7] = { " ",
" J ",
" O ",
" K ",
s32b oldgold;
char out_val[160], tmp_str[80], again;
- cptr p;
+ concptr p;
screen_save();
}
/*!
- * @brief モンスター闘技場に参加できるモンスターの判定
- * @param r_idx モンスターID
- * @details 基準はNEVER_MOVE MULTIPLY QUANTUM RF7_AQUATIC RF7_CHAMELEONのいずれも持たず、
- * 自爆以外のなんらかのHP攻撃手段を持っていること。
- * @return 参加できるか否か
- */
-static bool vault_aux_battle(MONRACE_IDX r_idx)
-{
- int i;
- HIT_POINT dam = 0;
-
- monster_race *r_ptr = &r_info[r_idx];
-
- /* Decline town monsters */
-/* if (!mon_hook_dungeon(r_idx)) return FALSE; */
-
- /* Decline unique monsters */
-/* if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); */
-/* if (r_ptr->flags7 & (RF7_NAZGUL)) return (FALSE); */
-
- if (r_ptr->flags1 & (RF1_NEVER_MOVE)) return (FALSE);
- if (r_ptr->flags2 & (RF2_MULTIPLY)) return (FALSE);
- if (r_ptr->flags2 & (RF2_QUANTUM)) return (FALSE);
- if (r_ptr->flags7 & (RF7_AQUATIC)) return (FALSE);
- if (r_ptr->flags7 & (RF7_CHAMELEON)) return (FALSE);
-
- for (i = 0; i < 4; i++)
- {
- 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->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);
-
- return (TRUE);
-}
-
-/*!
* @brief モンスター闘技場に参加するモンスターをリセットする。
* @return なし
*/
int j;
while (1)
{
- get_mon_num_prep(vault_aux_battle, NULL);
+ get_mon_num_prep(monster_can_entry_arena, NULL);
p_ptr->inside_battle = TRUE;
r_idx = get_mon_num(mon_level);
p_ptr->inside_battle = old_inside_battle;
s32b maxbet;
s32b wager;
char out_val[160], tmp_str[80];
- cptr p;
+ concptr p;
if ((turn - old_battle) > TURNS_PER_TICK*250)
{
for (i = 0; i < MAX_KUBI; i++)
{
byte color;
- cptr done_mark;
+ concptr done_mark;
monster_race *r_ptr = &r_info[(kubi_r_idx[i] > 10000 ? kubi_r_idx[i] - 10000 : kubi_r_idx[i])];
if (kubi_r_idx[i] > 10000)
INVENTORY_IDX i;
int j;
bool change = FALSE;
- char o_name[MAX_NLEN];
+ GAME_TEXT o_name[MAX_NLEN];
object_type *o_ptr;
/* Loop for inventory and right/left arm */
}
/*!
- * @brief 悪夢の元凶となるモンスターかどうかを返す。
- * @param r_idx 判定対象となるモンスターのID
- * @return 悪夢の元凶となり得るか否か。
- */
-bool get_nightmare(MONRACE_IDX r_idx)
-{
- monster_race *r_ptr = &r_info[r_idx];
-
- /* Require eldritch horrors */
- if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR))) return (FALSE);
-
- /* Require high level */
- if (r_ptr->level <= p_ptr->lev) return (FALSE);
-
- /* Accept this monster */
- return (TRUE);
-}
-
-/*!
* @brief 宿屋の利用サブルーチン
* @details inn commands\n
* Note that resting for the night was a perfect way to avoid player\n
*/
static void get_questinfo(IDX questnum, bool do_init)
{
- int i;
- IDX old_quest;
- char tmp_str[80];
+ int i;
+ IDX old_quest;
+ GAME_TEXT tmp_str[80];
/* Clear the text */
for (i = 0; i < 10; i++)
IDX q_index = 0;
monster_race *r_ptr;
quest_type *q_ptr;
- cptr name;
+ concptr name;
clear_bldg(4, 18);
* the current +dam of the player.\n
* @return なし
*/
-static void show_weapon_dmg(int r, int c, int mindice, int maxdice, int blows, int dam_bonus, cptr attr, byte color)
+static void show_weapon_dmg(int r, int c, int mindice, int maxdice, int blows, int dam_bonus, concptr attr, byte color)
{
- char tmp_str[80];
+ GAME_TEXT tmp_str[80];
int mindam, maxdam;
mindam = blows * (mindice + dam_bonus);
*/
static void list_weapon(object_type *o_ptr, TERM_LEN row, TERM_LEN col)
{
- char o_name[MAX_NLEN];
- char tmp_str[80];
+ GAME_TEXT o_name[MAX_NLEN];
+ GAME_TEXT tmp_str[80];
DICE_NUMBER eff_dd = o_ptr->dd + p_ptr->to_dd[0];
DICE_SID eff_ds = o_ptr->ds + p_ptr->to_ds[0];
/* Print the weapons base damage dice */
sprintf(tmp_str, " %2d %2d %2d %2d %2d (%%)",
- hit_chance(reli, 0),
- hit_chance(reli, 50),
- hit_chance(reli, 100),
- hit_chance(reli, 150),
- hit_chance(reli, 200));
+ (int)hit_chance(reli, 0),
+ (int)hit_chance(reli, 50),
+ (int)hit_chance(reli, 100),
+ (int)hit_chance(reli, 150),
+ (int)hit_chance(reli, 200));
put_str(tmp_str, row+3, col);
c_put_str(TERM_YELLOW, _("可能なダメージ:", "Possible Damage:"), row+5, col);
object_type *o_ptr[2];
object_type orig_weapon;
object_type *i_ptr;
- cptr q, s;
+ concptr q, s;
TERM_LEN row = 2;
TERM_LEN wid = 38, mgn = 2;
bool old_character_xtra = character_xtra;
i_ptr = &inventory[INVEN_RARM];
object_copy(&orig_weapon, i_ptr);
- /* Only compare melee weapons */
- item_tester_no_ryoute = TRUE;
item_tester_hook = item_tester_hook_orthodox_melee_weapons;
/* Get the first weapon */
q = _("第一の武器は?", "What is your first weapon? ");
s = _("比べるものがありません。", "You have nothing to compare.");
- o_ptr[0] = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN));
- if (!o_ptr)
+ o_ptr[0] = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | IGNORE_BOTHHAND_SLOT));
+ if (!o_ptr[0])
{
screen_load();
return (0);
clear_bldg(0, 22);
/* Only compare melee weapons */
- item_tester_no_ryoute = TRUE;
item_tester_hook = item_tester_hook_orthodox_melee_weapons;
/* Hack -- prevent "icky" message */
s = _("比べるものがありません。", "You have nothing to compare.");
/* Get the second weapon */
- o_ptr[1] = choose_object(&item2, q, s, (USE_EQUIP | USE_INVEN));
- if (!o_ptr) continue;
+ o_ptr[1] = choose_object(&item2, q, s, (USE_EQUIP | USE_INVEN | IGNORE_BOTHHAND_SLOT));
+ if (!o_ptr[1]) continue;
total += cost;
cost = bcost / 2;
int i, dd_bonus, ds_bonus;
KIND_OBJECT_IDX k_idx;
char basenm[MAX_NLEN];
- cptr q, s;
+ concptr q, s;
int row = 7;
clear_bldg(0, 22);
/* Only forge broken weapons */
item_tester_hook = item_tester_hook_orthodox_melee_weapons;
- if (!get_item(&mater, q, s, (USE_INVEN | USE_EQUIP))) return (0);
+ mo_ptr = choose_object(&mater, q, s, (USE_INVEN | USE_EQUIP));
+ if (!mo_ptr) return (0);
if (mater == item)
{
msg_print(_("クラインの壷じゃない!", "This is not a klein bottle!"));
return (0);
}
- /* Get the item (in the pack) */
- mo_ptr = &inventory[mater];
-
/* Display item name */
object_desc(basenm, mo_ptr, OD_NAME_ONLY);
prt(format(_("材料とする武器: %s", "Material : %s"), basenm), row+4, 2);
OBJECT_IDX item;
bool okay = FALSE;
object_type *o_ptr;
- cptr q, s;
+ concptr q, s;
int maxenchant = (p_ptr->lev / 5);
char tmp_str[MAX_NLEN];
prt(format(_("現在のあなたの技量だと、+%d まで改良できます。", " Based on your skill, we can improve up to +%d."), maxenchant), 5, 0);
prt(format(_(" 改良の料金は一個につき$%d です。", " The price for the service is %d gold per item."), cost), 7, 0);
- item_tester_no_ryoute = TRUE;
-
q = _("どのアイテムを改良しますか?", "Improve which item? ");
s = _("改良できるものがありません。", "You have nothing to improve.");
- o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_EQUIP));
+ o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_EQUIP | IGNORE_BOTHHAND_SLOT));
if (!o_ptr) return (FALSE);
/* Check if the player has enough money */
DEPTH lev;
object_type *o_ptr;
object_kind *k_ptr;
- cptr q, s;
+ concptr q, s;
PRICE price;
PARAMETER_VALUE charges;
int max_charges;
q = _("どのアイテムに魔力を充填しますか? ", "Recharge which item? ");
s = _("魔力を充填すべきアイテムがない。", "You have nothing to recharge.");
- if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
-
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &inventory[item];
- }
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
+ if (!o_ptr) return;
k_ptr = &k_info[o_ptr->k_idx];
get_check(_("$50で鑑定しますか? ", "Identify for 50 gold? ")))
{
- /* Pay the price */
p_ptr->au -= 50;
-
- /* Identify it */
identify_item(o_ptr);
-
- /* Description */
object_desc(tmp_str, o_ptr, 0);
msg_format(_("%s です。", "You have: %s."), tmp_str);
if (o_ptr->tval == TV_ROD)
{
#ifdef JP
-if (get_check(format("そのロッドを$%d で再充填しますか?",
- price)))
+ if (get_check(format("そのロッドを$%d で再充填しますか?", price)))
#else
if (get_check(format("Recharge the %s for %d gold? ",
((o_ptr->number > 1) ? "rods" : "rod"), price)))
#endif
/* Combine / Reorder the pack (later) */
- p_ptr->notice |= (PN_COMBINE | PN_REORDER);
+ p_ptr->update |= (PU_COMBINE | PU_REORDER);
p_ptr->window |= (PW_INVEN);
/* skip non magic device */
if (o_ptr->tval < TV_STAFF || o_ptr->tval > TV_ROD) continue;
- /* Identify it */
if (!object_is_known(o_ptr))
{
identify_item(o_ptr);
msg_print(NULL);
/* Combine / Reorder the pack (later) */
- p_ptr->notice |= (PN_COMBINE | PN_REORDER);
+ p_ptr->update |= (PU_COMBINE | PU_REORDER);
p_ptr->window |= (PW_INVEN);
*/
bool tele_town(void)
{
- int i, x, y;
+ int i;
+ POSITION x, y;
int num = 0;
if (dun_level)
/* Allocate the "who" array */
- C_MAKE(who, max_r_idx, IDX);
+ C_MAKE(who, max_r_idx, MONRACE_IDX);
/* Collect matching monsters */
for (n = 0, i = 1; i < max_r_idx; i++)
if (!n)
{
/* Free the "who" array */
- C_KILL(who, max_r_idx, IDX);
+ C_KILL(who, max_r_idx, MONRACE_IDX);
/* Restore */
screen_load();
/* prt(buf, 5, 5);*/
/* Free the "who" array */
- C_KILL(who, max_r_idx, IDX);
+ C_KILL(who, max_r_idx, MONRACE_IDX);
/* Restore */
screen_load();
BACT_IDX bact = bldg->actions[i];
PRICE bcost;
bool paid = FALSE;
- int amt;
msg_flag = FALSE;
msg_erase();
item_tester_tval = TV_BOW;
enchant_item(bcost, 1, 1, 0);
break;
+
case BACT_RECALL:
- if (recall_player(1)) paid = TRUE;
+ if (recall_player(p_ptr, 1)) paid = TRUE;
break;
- case BACT_TELEPORT_LEVEL:
- {
- IDX select_dungeon;
- DEPTH max_depth;
+ case BACT_TELEPORT_LEVEL:
clear_bldg(4, 20);
- select_dungeon = choose_dungeon(_("にテレポート", "teleport"), 4, 0);
- show_building(bldg);
- if (!select_dungeon) return;
-
- max_depth = d_info[select_dungeon].maxdepth;
-
- /* Limit depth in Angband */
- if (select_dungeon == DUNGEON_ANGBAND)
- {
- if (quest[QUEST_OBERON].status != QUEST_STATUS_FINISHED) max_depth = 98;
- 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), (QUANTITY)max_depth);
-
- if (amt > 0)
- {
- p_ptr->word_recall = 1;
- p_ptr->recall_dungeon = select_dungeon;
- max_dlv[p_ptr->recall_dungeon] = ((amt > d_info[select_dungeon].maxdepth) ? d_info[select_dungeon].maxdepth : ((amt < d_info[select_dungeon].mindepth) ? d_info[select_dungeon].mindepth : amt));
- if (record_maxdepth)
- do_cmd_write_nikki(NIKKI_TRUMP, select_dungeon, _("トランプタワーで", "at Trump Tower"));
-
- msg_print(_("回りの大気が張りつめてきた...", "The air about you becomes charged..."));
-
- paid = TRUE;
- p_ptr->redraw |= (PR_STATUS);
- }
+ paid = free_level_recall(p_ptr);
break;
- }
+
case BACT_LOSE_MUTATION:
- if (p_ptr->muta1 || p_ptr->muta2 ||
- (p_ptr->muta3 & ~MUT3_GOOD_LUCK) ||
- (p_ptr->pseikaku != SEIKAKU_LUCKY &&
- (p_ptr->muta3 & MUT3_GOOD_LUCK)))
+ if (p_ptr->muta1 || p_ptr->muta2 || (p_ptr->muta3 & ~MUT3_GOOD_LUCK) ||
+ (p_ptr->pseikaku != SEIKAKU_LUCKY && (p_ptr->muta3 & MUT3_GOOD_LUCK)))
{
while(!lose_mutation(0));
paid = TRUE;
msg_print(NULL);
}
break;
+
case BACT_BATTLE:
kakutoujou();
break;
+
case BACT_TSUCHINOKO:
tsuchinoko();
break;
+
case BACT_KUBI:
shoukinkubi();
break;
+
case BACT_TARGET:
today_target();
break;
+
case BACT_KANKIN:
kankin();
break;
+
case BACT_HEIKOUKA:
msg_print(_("平衡化の儀式を行なった。", "You received an equalization ritual."));
set_virtue(V_COMPASSION, 0);
get_virtues();
paid = TRUE;
break;
+
case BACT_TELE_TOWN:
paid = tele_town();
break;
+
case BACT_EVAL_AC:
paid = eval_ac(p_ptr->dis_ac + p_ptr->dis_to_a);
break;
+
case BACT_BROKEN_WEAPON:
paid = TRUE;
bcost = repair_broken_weapon(bcost);
*/
void do_cmd_quest(void)
{
+ if(p_ptr->wild_mode) return;
+
p_ptr->energy_use = 100;
if (!cave_have_flag_bold(p_ptr->y, p_ptr->x, FF_QUEST_ENTER))
if (!get_check(_("クエストに入りますか?", "Do you enter? "))) return;
if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON))
msg_print(_("『とにかく入ってみようぜぇ。』", ""));
+ else if(p_ptr->pseikaku == SEIKAKU_CHARGEMAN) msg_print("『全滅してやるぞ!』");
/* Player enters a new quest */
p_ptr->oldpy = 0;
bool validcmd;
building_type *bldg;
+ if(p_ptr->wild_mode) return;
p_ptr->energy_use = 100;
p_ptr->oldpx = p_ptr->x;
}
- /* Forget the lite */
forget_lite();
-
- /* Forget the view */
forget_view();
/* Hack -- Increase "icky" depth */
/*!
* @brief クエスト突入時のメッセージテーブル / Array of places to find an inscription
*/
-static cptr find_quest[] =
+static concptr find_quest[] =
{
_("床にメッセージが刻まれている:", "You find the following inscription in the floor"),
_("壁にメッセージが刻まれている:", "You see a message inscribed in the wall"),
*/
void quest_discovery(QUEST_IDX q_idx)
{
- quest_type *q_ptr = &quest[q_idx];
- monster_race *r_ptr = &r_info[q_ptr->r_idx];
- int q_num = q_ptr->max_num;
- char name[80];
+ quest_type *q_ptr = &quest[q_idx];
+ monster_race *r_ptr = &r_info[q_ptr->r_idx];
+ MONSTER_NUMBER q_num = q_ptr->max_num;
+ GAME_TEXT name[MAX_NLEN];
/* No quest index */
if (!q_idx) return;
/* Unique */
/* Hack -- "unique" monsters must be "unique" */
- if ((r_ptr->flags1 & RF1_UNIQUE) &&
- (0 == r_ptr->max_num))
+ if ((r_ptr->flags1 & RF1_UNIQUE) && (0 == r_ptr->max_num))
{
msg_print(_("この階は以前は誰かによって守られていたようだ…。", "It seems that this level was protected by someone before..."));
/* The unique is already dead */