X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fxtra2.c;h=b227e5fecd62e65bbede08a52e224d30a48221bc;hb=6f3a1d8fb3d0c49b1f02d41464fd5767f188f9f5;hp=f62015fe89d878be321e80f1d16b55cf2dd91140;hpb=bc066bf42a9eb443ef005ac0f566f1fd678b551a;p=hengband%2Fhengband.git diff --git a/src/xtra2.c b/src/xtra2.c index f62015fe8..b227e5fec 100644 --- a/src/xtra2.c +++ b/src/xtra2.c @@ -13,6 +13,8 @@ #include "angband.h" #include "cmd-pet.h" +#include "object-curse.h" +#include "monster-hook.h" #define REWARD_CHANCE 10 @@ -48,8 +50,6 @@ void check_experience(void) /* Redraw experience */ p_ptr->redraw |= (PR_EXP); - - /* Handle stuff */ handle_stuff(); @@ -59,17 +59,9 @@ void check_experience(void) { /* Lose a level */ p_ptr->lev--; - - /* Update some stuff */ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); - - /* Redraw some stuff */ p_ptr->redraw |= (PR_LEV | PR_TITLE); - - /* Window stuff */ p_ptr->window |= (PW_PLAYER); - - /* Handle stuff */ handle_stuff(); } @@ -102,22 +94,14 @@ void check_experience(void) sound(SOUND_LEVEL); - /* Message */ msg_format(_("レベル %d にようこそ。", "Welcome to level %d."), p_ptr->lev); - /* Update some stuff */ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); - - /* Redraw some stuff */ p_ptr->redraw |= (PR_LEV | PR_TITLE | PR_EXP); - - /* Window stuff */ p_ptr->window |= (PW_PLAYER | PW_SPELL | PW_INVEN); /* HPとMPの上昇量を表示 */ level_up = 1; - - /* Handle stuff */ handle_stuff(); level_up = 0; @@ -198,16 +182,9 @@ void check_experience(void) level_reward = FALSE; } - /* Update some stuff */ p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); - - /* Redraw some stuff */ p_ptr->redraw |= (PR_LEV | PR_TITLE); - - /* Window stuff */ p_ptr->window |= (PW_PLAYER | PW_SPELL); - - /* Handle stuff */ handle_stuff(); } @@ -223,7 +200,7 @@ void check_experience(void) * @details * Hack -- Return the "automatic coin type" of a monster race * Used to allocate proper treasure when "Creeping coins" die - * XXX XXX XXX Note the use of actual "monster names" + * Note the use of actual "monster names" */ static int get_coin_type(MONRACE_IDX r_idx) { @@ -394,7 +371,7 @@ static bool kind_is_hafted(KIND_OBJECT_IDX k_idx) * @param quest_num 達成状態にしたいクエストのID * @return なし */ -void complete_quest(int quest_num) +void complete_quest(QUEST_IDX quest_num) { quest_type* const q_ptr = &quest[quest_num]; @@ -455,8 +432,7 @@ static MONSTER_NUMBER count_all_hostile_monsters(void) void check_quest_completion(monster_type *m_ptr) { POSITION y, x; - - int quest_num; + QUEST_IDX quest_num; bool create_stairs = FALSE; bool reward = FALSE; @@ -469,12 +445,12 @@ void check_quest_completion(monster_type *m_ptr) x = m_ptr->fx; /* Inside a quest */ - quest_num = p_ptr->inside_quest; + quest_num = p_ptr->inside_quest; /* Search for an active quest on this dungeon level */ if (!quest_num) { - int i; + QUEST_IDX i; for (i = max_q_idx - 1; i > 0; i--) { @@ -650,10 +626,7 @@ void check_quest_completion(monster_type *m_ptr) for (i = 0; i < (dun_level / 15)+1; i++) { - /* Get local object */ o_ptr = &forge; - - /* Wipe the object */ object_wipe(o_ptr); /* Make a great object */ @@ -673,13 +646,13 @@ void check_quest_completion(monster_type *m_ptr) */ void check_find_art_quest_completion(object_type *o_ptr) { - int i; + QUEST_IDX i; /* Check if completed a quest */ for (i = 0; i < max_q_idx; i++) { - if ((quest[i].type == QUEST_TYPE_FIND_ARTIFACT) && - (quest[i].status == QUEST_STATUS_TAKEN) && - (quest[i].k_idx == o_ptr->name1)) + if((quest[i].type == QUEST_TYPE_FIND_ARTIFACT) && + (quest[i].status == QUEST_STATUS_TAKEN) && + (quest[i].k_idx == o_ptr->name1)) { complete_quest(i); } @@ -693,10 +666,11 @@ void check_find_art_quest_completion(object_type *o_ptr) * @param r_ptr 撃破されたモンスターの種族情報を持つ構造体の参照ポインタ * @return 撃破されたモンスターの述語 */ -cptr extract_note_dies(monster_race *r_ptr) +cptr extract_note_dies(MONRACE_IDX r_idx) { + monster_race *r_ptr = &r_info[r_idx]; /* Some monsters get "destroyed" */ - if (!monster_living(r_ptr)) + if (!monster_living(r_idx)) { int i; @@ -734,15 +708,14 @@ cptr extract_note_dies(monster_race *r_ptr) */ void monster_death(MONSTER_IDX m_idx, bool drop_item) { - int i, j, y, x; + int i, j; + POSITION y, x; int dump_item = 0; int dump_gold = 0; - int number = 0; monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; bool visible = ((m_ptr->ml && !p_ptr->image) || (r_ptr->flags1 & RF1_UNIQUE)); @@ -823,12 +796,10 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) if (arena_info[p_ptr->arena_number].tval) { - /* Get local object */ q_ptr = &forge; /* Prepare to make a prize */ object_prep(q_ptr, lookup_kind(arena_info[p_ptr->arena_number].tval, arena_info[p_ptr->arena_number].sval)); - apply_magic(q_ptr, object_level, AM_NO_FIXED_ART); /* Drop it in the dungeon */ @@ -886,8 +857,6 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) if (!one_in_(5)) corpse = TRUE; } } - - /* Get local object */ q_ptr = &forge; /* Prepare to make an object */ @@ -939,7 +908,6 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) /* Bloodletters of Khorne may drop a blade of chaos */ if (drop_chosen_item && (randint1(100) < 15)) { - /* Get local object */ q_ptr = &forge; /* Prepare to make a Blade of Chaos */ @@ -955,10 +923,7 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) case MON_RAAL: if (drop_chosen_item && (dun_level > 9)) { - /* Get local object */ q_ptr = &forge; - - /* Wipe the object */ object_wipe(q_ptr); /* Activate restriction */ @@ -1061,8 +1026,6 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) case MON_SERPENT: if (!drop_chosen_item) break; - - /* Get local object */ q_ptr = &forge; /* Mega-Hack -- Prepare to make "Grond" */ @@ -1076,8 +1039,6 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) /* Drop it in the dungeon */ (void)drop_near(q_ptr, -1, y, x); - - /* Get local object */ q_ptr = &forge; /* Mega-Hack -- Prepare to make "Chaos" */ @@ -1096,7 +1057,6 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) case MON_B_DEATH_SWORD: if (drop_chosen_item) { - /* Get local object */ q_ptr = &forge; /* Prepare to make a broken sword */ @@ -1112,7 +1072,6 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) if (drop_chosen_item && ((m_ptr->r_idx == MON_A_GOLD) || ((m_ptr->r_idx == MON_A_SILVER) && (r_ptr->r_akills % 5 == 0)))) { - /* Get local object */ q_ptr = &forge; /* Prepare to make a Can of Toys */ @@ -1140,10 +1099,7 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) case '(': if (dun_level > 0) { - /* Get local object */ q_ptr = &forge; - - /* Wipe the object */ object_wipe(q_ptr); /* Activate restriction */ @@ -1160,10 +1116,7 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) case '/': if (dun_level > 4) { - /* Get local object */ q_ptr = &forge; - - /* Wipe the object */ object_wipe(q_ptr); /* Activate restriction */ @@ -1180,10 +1133,7 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) case '[': if (dun_level > 19) { - /* Get local object */ q_ptr = &forge; - - /* Wipe the object */ object_wipe(q_ptr); /* Activate restriction */ @@ -1200,10 +1150,7 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) case '\\': if (dun_level > 4) { - /* Get local object */ q_ptr = &forge; - - /* Wipe the object */ object_wipe(q_ptr); /* Activate restriction */ @@ -1220,10 +1167,7 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) case '|': if (m_ptr->r_idx != MON_STORMBRINGER) { - /* Get local object */ q_ptr = &forge; - - /* Wipe the object */ object_wipe(q_ptr); /* Activate restriction */ @@ -1300,7 +1244,6 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) if (k_idx) { - /* Get local object */ q_ptr = &forge; /* Prepare to make a reward */ @@ -1342,10 +1285,7 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) /* Drop some objects */ for (j = 0; j < number; j++) { - /* Get local object */ q_ptr = &forge; - - /* Wipe the object */ object_wipe(q_ptr); /* Make Gold */ @@ -1354,7 +1294,6 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) /* Make some gold */ if (!make_gold(q_ptr)) continue; - /* XXX XXX XXX */ dump_gold++; } @@ -1364,7 +1303,6 @@ void monster_death(MONSTER_IDX m_idx, bool drop_item) /* Make an object */ if (!make_object(q_ptr, mo_mode)) continue; - /* XXX XXX XXX */ dump_item++; } @@ -1565,7 +1503,7 @@ static void get_exp_from_mon(HIT_POINT dam, monster_type *m_ptr) * Made name, sex, and capitalization generic -BEN- * As always, the "ghost" processing is a total hack. * Hack -- we "delay" fear messages by passing around a "fear" flag. - * XXX XXX XXX Consider decreasing monster experience over time, say, + * Consider decreasing monster experience over time, say, * by using "(m_exp * m_lev * (m_lev)) / (p_lev * (m_lev + n_killed))" * instead of simply "(m_exp * m_lev) / (p_lev)", to make the first * monster worth more than subsequent monsters. This would also need @@ -1574,15 +1512,14 @@ static void get_exp_from_mon(HIT_POINT dam, monster_type *m_ptr) */ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note) { - monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - - monster_type exp_mon; + monster_type *m_ptr = &m_list[m_idx]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_type exp_mon; /* Innocent until proven otherwise */ - bool innocent = TRUE, thief = FALSE; - int i; - int expdam; + bool innocent = TRUE, thief = FALSE; + int i; + HIT_POINT expdam; (void)COPY(&exp_mon, m_ptr, monster_type); @@ -1597,7 +1534,6 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note) if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH); - /* Wake it up */ (void)set_monster_csleep(m_idx, 0); /* Hack - Cancel any special player stealth magics. -LM- */ @@ -1609,15 +1545,14 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note) /* Genocided by chaos patron */ if (!m_idx) return TRUE; - /* Hurt it */ m_ptr->hp -= dam; - m_ptr->dealt_damage += dam; + if(m_ptr->dealt_damage > m_ptr->max_maxhp * 100) m_ptr->dealt_damage = m_ptr->max_maxhp * 100; + if (p_ptr->wizard) { - msg_format( _("合計%d/%dのダメージを与えた。","You do %d (out of %d) damage."), - m_ptr->dealt_damage, m_ptr->maxhp); + msg_format( _("合計%d/%dのダメージを与えた。","You do %d (out of %d) damage."), m_ptr->dealt_damage, m_ptr->maxhp); } /* It is dead now */ @@ -1716,13 +1651,13 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note) /* Dump a message */ if (!get_rnd_line(_("mondeath_j.txt", "mondeath.txt"), m_ptr->r_idx, line_got)) - + { msg_format("%^s %s", m_name, line_got); + } #ifdef WORLD_SCORE if (m_ptr->r_idx == MON_SERPENT) { - /* Make screen dump */ screen_dump = make_screen_dump(); } #endif @@ -1765,8 +1700,7 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note) chg_virtue(V_COMPASSION, -1); } - if ((r_ptr->flags3 & RF3_GOOD) && - ((r_ptr->level) / 10 + (3 * dun_level) >= randint1(100))) + if ((r_ptr->flags3 & RF3_GOOD) && ((r_ptr->level) / 10 + (3 * dun_level) >= randint1(100))) chg_virtue(V_UNLIFE, 1); if (r_ptr->d_char == 'A') @@ -1823,8 +1757,7 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note) { if (r_ptr->flags1 & RF1_UNIQUE) chg_virtue(V_JUSTICE, 3); - else if (1+((r_ptr->level) / 10 + (2 * dun_level)) - >= randint1(100)) + else if (1+((r_ptr->level) / 10 + (2 * dun_level)) >= randint1(100)) chg_virtue(V_JUSTICE, 1); } else if (innocent) @@ -1840,11 +1773,7 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note) if ((r_ptr->flags1 & RF1_UNIQUE) && record_destroy_uniq) { char note_buf[160]; -#ifdef JP - sprintf(note_buf, "%s%s", r_name + r_ptr->name, (m_ptr->smart & SM_CLONED) ? "(クローン)" : ""); -#else - sprintf(note_buf, "%s%s", r_name + r_ptr->name, (m_ptr->smart & SM_CLONED) ? "(Clone)" : ""); -#endif + sprintf(note_buf, "%s%s", r_name + r_ptr->name, (m_ptr->smart & SM_CLONED) ? _("(クローン)", "(Clone)") : ""); do_cmd_write_nikki(NIKKI_UNIQUE, 0, note_buf); } @@ -1872,7 +1801,7 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note) } /* Death by Physical attack -- non-living monster */ - else if (!monster_living(r_ptr)) + else if (!monster_living(m_ptr->r_idx)) { bool explode = FALSE; @@ -1890,7 +1819,7 @@ bool mon_take_hit(MONSTER_IDX m_idx, HIT_POINT dam, bool *fear, cptr note) if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)) msg_format("せっかくだから%sを倒した。", m_name); else -msg_format("%sを倒した。", m_name); + msg_format("%sを倒した。", m_name); #else msg_format("You have destroyed %s.", m_name); #endif @@ -1904,7 +1833,7 @@ msg_format("%sを倒した。", m_name); if ((p_ptr->pseikaku == SEIKAKU_COMBAT) || (inventory[INVEN_BOW].name1 == ART_CRIMSON)) msg_format("せっかくだから%sを葬り去った。", m_name); else -msg_format("%sを葬り去った。", m_name); + msg_format("%sを葬り去った。", m_name); #else msg_format("You have slain %s.", m_name); #endif @@ -1926,18 +1855,13 @@ msg_format("%sを葬り去った。", m_name); monster_death(m_idx, TRUE); /* Mega hack : replace IKETA to BIKETAL */ - if ((m_ptr->r_idx == MON_IKETA) && - !(p_ptr->inside_arena || p_ptr->inside_battle)) + if ((m_ptr->r_idx == MON_IKETA) && !(p_ptr->inside_arena || p_ptr->inside_battle)) { - int dummy_y = m_ptr->fy; - int dummy_x = m_ptr->fx; + POSITION dummy_y = m_ptr->fy; + POSITION dummy_x = m_ptr->fx; BIT_FLAGS mode = 0L; - if (is_pet(m_ptr)) mode |= PM_FORCE_PET; - - /* Delete the monster */ delete_monster_idx(m_idx); - if (summon_named_creature(0, dummy_y, dummy_x, MON_BIKETAL, mode)) { msg_print(_("「ハァッハッハッハ!!私がバイケタルだ!!」", "Uwa-hahaha! *I* am Biketal!")); @@ -1945,7 +1869,6 @@ msg_format("%sを葬り去った。", m_name); } else { - /* Delete the monster */ delete_monster_idx(m_idx); } @@ -1982,13 +1905,12 @@ msg_format("%sを葬り去った。", m_name); * Run (sometimes) if at 10% or less of max hit points, * or (usually) when hit for half its current hit points */ - if ((randint1(10) >= percentage) || - ((dam >= m_ptr->hp) && (randint0(100) < 80))) + if ((randint1(10) >= percentage) || ((dam >= m_ptr->hp) && (randint0(100) < 80))) { /* Hack -- note fear */ (*fear) = TRUE; - /* XXX XXX XXX Hack -- Add some timed fear */ + /* Hack -- Add some timed fear */ (void)set_monster_monfear(m_idx, (randint1(10) + (((dam >= m_ptr->hp) && (percentage > 7)) ? 20 : ((11 - percentage) * 5)))); @@ -1997,22 +1919,6 @@ msg_format("%sを葬り去った。", m_name); #endif -#if 0 - if (p_ptr->riding && (p_ptr->riding == m_idx) && (dam > 0)) - { - char m_name[80]; - - /* Extract monster name */ - monster_desc(m_name, m_ptr, 0); - - if (m_ptr->hp > m_ptr->maxhp/3) dam = (dam + 1) / 2; - if (rakuba((dam > 200) ? 200 : dam, FALSE)) - { - msg_format(_("%^sに振り落とされた!", "%^s has thrown you off!"), m_name); - } - } -#endif - /* Not dead yet */ return (FALSE); } @@ -2025,7 +1931,7 @@ msg_format("%sを葬り去った。", m_name); * @param hgt_p コンソールの表示行数を返す * @return なし */ -void get_screen_size(int *wid_p, int *hgt_p) +void get_screen_size(TERM_LEN *wid_p, TERM_LEN *hgt_p) { Term_get_size(wid_p, hgt_p); *hgt_p -= ROW_MAP + 2; @@ -2043,7 +1949,6 @@ void panel_bounds_center(void) { int wid, hgt; - /* Get size */ get_screen_size(&wid, &hgt); panel_row_max = panel_row_min + hgt - 1; @@ -2073,7 +1978,6 @@ void resize_map(void) verify_panel(); - /* Update stuff */ p_ptr->update |= (PU_TORCH | PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); /* Forget lite/view */ @@ -2090,8 +1994,6 @@ void resize_map(void) /* Hack -- update */ handle_stuff(); - - /* Redraw */ Term_redraw(); /* @@ -2114,16 +2016,11 @@ void redraw_window(void) /* Only if the dungeon exists */ if (!character_dungeon) return; - /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER); - - /* Window stuff */ p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT); /* Hack -- update */ handle_stuff(); - - /* Redraw */ Term_redraw(); } @@ -2137,12 +2034,11 @@ void redraw_window(void) * Also used in do_cmd_locate * @return 実際に再描画が必要だった場合TRUEを返す */ -bool change_panel(int dy, int dx) +bool change_panel(POSITION dy, POSITION dx) { - int y, x; - int wid, hgt; + POSITION y, x; + TERM_LEN wid, hgt; - /* Get size */ get_screen_size(&wid, &hgt); /* Apply the motion */ @@ -2167,13 +2063,9 @@ bool change_panel(int dy, int dx) /* Recalculate the boundaries */ panel_bounds_center(); - /* Update stuff */ p_ptr->update |= (PU_MONSTERS); - /* Redraw map */ p_ptr->redraw |= (PR_MAP); - - /* Handle stuff */ handle_stuff(); /* Success */ @@ -2199,7 +2091,6 @@ static bool change_panel_xy(POSITION y, POSITION x) POSITION dy = 0, dx = 0; TERM_LEN wid, hgt; - /* Get size */ get_screen_size(&wid, &hgt); if (y < panel_row_min) dy = -1; @@ -2233,7 +2124,6 @@ void verify_panel(void) int max_prow_min; int max_pcol_min; - /* Get size */ get_screen_size(&wid, &hgt); max_prow_min = cur_hgt - hgt; @@ -2310,18 +2200,13 @@ void verify_panel(void) panel_col_min = pcol_min; /* Hack -- optional disturb on "panel change" */ - if (disturb_panel && !center_player) disturb(0, 0); + if (disturb_panel && !center_player) disturb(FALSE, FALSE); /* Recalculate the boundaries */ panel_bounds_center(); - /* Update stuff */ p_ptr->update |= (PU_MONSTERS); - - /* Redraw map */ p_ptr->redraw |= (PR_MAP); - - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); } @@ -2332,14 +2217,14 @@ void verify_panel(void) cptr look_mon_desc(monster_type *m_ptr, BIT_FLAGS mode) { monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx]; - bool living; - int perc; + bool living; + int perc; cptr desc; cptr attitude; cptr clone; /* Determine if the monster is "living" */ - living = monster_living(ap_r_ptr); + living = monster_living(m_ptr->ap_r_idx); /* Calculate a health "percentage" */ perc = 100L * m_ptr->hp / m_ptr->maxhp; @@ -2347,55 +2232,29 @@ cptr look_mon_desc(monster_type *m_ptr, BIT_FLAGS mode) /* Healthy monsters */ if (m_ptr->hp >= m_ptr->maxhp) { - /* No damage */ -#ifdef JP - desc = living ? "無傷" : "無ダメージ"; -#else - desc = living ? "unhurt" : "undamaged"; -#endif - + desc = living ? _("無傷", "unhurt") : _("無ダメージ", "undamaged"); } else if (perc >= 60) { -#ifdef JP - desc = living ? "軽傷" : "小ダメージ"; -#else - desc = living ? "somewhat wounded" : "somewhat damaged"; -#endif - + desc = living ? _("軽傷", "somewhat wounded") : _("小ダメージ", "somewhat damaged"); } else if (perc >= 25) { -#ifdef JP - desc = living ? "負傷" : "中ダメージ"; -#else - desc = living ? "wounded" : "damaged"; -#endif - + desc = living ? _("負傷", "wounded") : _("中ダメージ", "damaged"); } else if (perc >= 10) { -#ifdef JP - desc = living ? "重傷" : "大ダメージ"; -#else - desc = living ? "badly wounded" : "badly damaged"; -#endif - + desc = living ? _("重傷", "badly wounded") : _("大ダメージ", "badly damaged"); } else { -#ifdef JP - desc = living ? "半死半生" : "倒れかけ"; -#else - desc = living ? "almost dead" : "almost destroyed"; -#endif + desc = living ? _("半死半生", "almost dead") : _("倒れかけ", "almost destroyed"); } - /* Need attitude information? */ if (!(mode & 0x01)) { @@ -2415,7 +2274,6 @@ cptr look_mon_desc(monster_type *m_ptr, BIT_FLAGS mode) attitude = _("", ""); } - /* Clone monster? */ if (m_ptr->smart & SM_CLONED) { @@ -2435,6 +2293,7 @@ cptr look_mon_desc(monster_type *m_ptr, BIT_FLAGS mode) { return format(_("レベル???, %s%s%s", "Level ???, %s%s%s"), desc, attitude, clone); } + } @@ -2539,7 +2398,7 @@ bool target_able(MONSTER_IDX m_idx) /* Monster must be projectable */ if (!projectable(p_ptr->y, p_ptr->x, m_ptr->fy, m_ptr->fx)) return (FALSE); - /* XXX XXX XXX Hack -- Never target trappers */ + /* Hack -- Never target trappers */ /* if (CLEAR_ATTR && (CLEAR_CHAR)) return (FALSE); */ /* Assume okay */ @@ -2744,7 +2603,7 @@ static POSITION_IDX target_pick(POSITION y1, POSITION x1, POSITION dy, POSITION /* Approximate Double Distance */ v = ((x4 > y4) ? (x4 + x4 + y4) : (y4 + y4 + x4)); - /* XXX XXX XXX Penalize location */ + /* Penalize location */ /* Track best */ if ((b_i >= 0) && (v >= b_v)) continue; @@ -2752,8 +2611,6 @@ static POSITION_IDX target_pick(POSITION y1, POSITION x1, POSITION dy, POSITION /* Track best */ b_i = i; b_v = v; } - - /* Result */ return (b_i); } @@ -2791,8 +2648,6 @@ static bool target_set_accept(POSITION y, POSITION x) for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; - - /* Acquire object */ o_ptr = &o_list[this_o_idx]; /* Acquire next object */ @@ -2812,7 +2667,6 @@ static bool target_set_accept(POSITION y, POSITION x) if (have_flag(f_info[get_feat_mimic(c_ptr)].flags, FF_NOTICE)) return TRUE; } - /* Nope */ return (FALSE); } @@ -2824,8 +2678,8 @@ static bool target_set_accept(POSITION y, POSITION x) */ static void target_set_prepare(BIT_FLAGS mode) { - int y, x; - int min_hgt, max_hgt, min_wid, max_wid; + POSITION y, x; + POSITION min_hgt, max_hgt, min_wid, max_wid; if (mode & TARGET_KILL) { @@ -2980,22 +2834,20 @@ bool show_gold_on_floor = FALSE; * recall info and the health bar info to track that monster. * * Eventually, we may allow multiple objects per grid, or objects - * and terrain features in the same grid. XXX XXX XXX + * and terrain features in the same grid. * * This function must handle blindness/hallucination. */ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) { cave_type *c_ptr = &cave[y][x]; - s16b this_o_idx, next_o_idx = 0; + OBJECT_IDX this_o_idx, next_o_idx = 0; cptr s1 = "", s2 = "", s3 = "", x_info = ""; bool boring = TRUE; FEAT_IDX feat; feature_type *f_ptr; char query = '\001'; char out_val[MAX_NLEN+80]; - -#ifdef ALLOW_EASY_FLOOR OBJECT_IDX floor_list[23]; ITEM_NUMBER floor_num = 0; @@ -3010,8 +2862,6 @@ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) } } -#endif /* ALLOW_EASY_FLOOR */ - /* Hack -- under the player */ if (player_bold(y, x)) { @@ -3075,8 +2925,6 @@ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) /* Hack -- health bar for this monster */ health_track(c_ptr->m_idx); - - /* Hack -- handle stuff */ handle_stuff(); /* Interact */ @@ -3166,8 +3014,6 @@ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) char o_name[MAX_NLEN]; object_type *o_ptr; - - /* Acquire object */ o_ptr = &o_list[this_o_idx]; /* Acquire next object */ @@ -3176,7 +3022,6 @@ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) /* Obtain an object description */ object_desc(o_name, o_ptr, 0); - /* Describe the object */ #ifdef JP sprintf(out_val, "%s%s%s%s[%s]", s1, o_name, s2, s3, info); #else @@ -3206,8 +3051,6 @@ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) #endif } - -#ifdef ALLOW_EASY_FLOOR if (floor_num) { int min_width = 0; @@ -3219,20 +3062,14 @@ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) char o_name[MAX_NLEN]; object_type *o_ptr; - - /* Acquire object */ o_ptr = &o_list[floor_list[0]]; - /* Describe the object */ object_desc(o_name, o_ptr, 0); - /* Message */ #ifdef JP - sprintf(out_val, "%s%s%s%s[%s]", - s1, o_name, s2, s3, info); + sprintf(out_val, "%s%s%s%s[%s]", s1, o_name, s2, s3, info); #else - sprintf(out_val, "%s%s%s%s [%s]", - s1, s2, s3, o_name, info); + sprintf(out_val, "%s%s%s%s [%s]", s1, s2, s3, o_name, info); #endif prt(out_val, 0, 0); @@ -3250,11 +3087,9 @@ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) { /* Display rough information about items */ #ifdef JP - sprintf(out_val, "%s %d個のアイテム%s%s ['x'で一覧, %s]", - s1, (int)floor_num, s2, s3, info); + sprintf(out_val, "%s %d個のアイテム%s%s ['x'で一覧, %s]", s1, (int)floor_num, s2, s3, info); #else - sprintf(out_val, "%s%s%sa pile of %d items [x,%s]", - s1, s2, s3, (int)floor_num, info); + sprintf(out_val, "%s%s%sa pile of %d items [x,%s]", s1, s2, s3, (int)floor_num, info); #endif prt(out_val, 0, 0); @@ -3275,8 +3110,6 @@ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) { int i; OBJECT_IDX o_idx; - - /* Save screen */ screen_save(); /* Display */ @@ -3286,19 +3119,13 @@ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) /* Prompt */ #ifdef JP - sprintf(out_val, "%s %d個のアイテム%s%s [Enterで次へ, %s]", - s1, (int)floor_num, s2, s3, info); + sprintf(out_val, "%s %d個のアイテム%s%s [Enterで次へ, %s]", s1, (int)floor_num, s2, s3, info); #else - sprintf(out_val, "%s%s%sa pile of %d items [Enter,%s]", - s1, s2, s3, (int)floor_num, info); + sprintf(out_val, "%s%s%sa pile of %d items [Enter,%s]", s1, s2, s3, (int)floor_num, info); #endif prt(out_val, 0, 0); - - /* Wait */ query = inkey(); - - /* Load screen */ screen_load(); /* Exit unless 'Enter' */ @@ -3330,15 +3157,11 @@ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) /* NOTREACHED */ } -#endif /* ALLOW_EASY_FLOOR */ - /* Scan all objects in the grid */ for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; - - /* Acquire object */ o_ptr = &o_list[this_o_idx]; /* Acquire next object */ @@ -3355,7 +3178,6 @@ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) /* Obtain an object description */ object_desc(o_name, o_ptr, 0); - /* Describe the object */ #ifdef JP sprintf(out_val, "%s%s%s%s[%s]", s1, o_name, s2, s3, info); #else @@ -3533,10 +3355,10 @@ static char target_set_aux(POSITION y, POSITION x, BIT_FLAGS mode, cptr info) * * All locations must be on the current panel. Consider the use of * "panel_bounds()" to allow "off-panel" targets, perhaps by using - * some form of "scrolling" the map around the cursor. XXX XXX XXX + * some form of "scrolling" the map around the cursor. * That is, consider the possibility of "auto-scrolling" the screen * while the cursor moves around. This may require changes in the - * "update_mon()" code to allow "visibility" even if off panel, and + * "update_monster()" code to allow "visibility" even if off panel, and * may require dynamic recalculation of the "temp" grid set. * * Hack -- targeting/observing an "outer border grid" may induce @@ -3583,7 +3405,6 @@ bool target_set(BIT_FLAGS mode) int wid, hgt; - /* Get size */ get_screen_size(&wid, &hgt); /* Cancel target */ @@ -3720,16 +3541,11 @@ bool target_set(BIT_FLAGS mode) /* Recenter the map around the player */ verify_panel(); - /* Update stuff */ p_ptr->update |= (PU_MONSTERS); - /* Redraw map */ p_ptr->redraw |= (PR_MAP); - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD); - - /* Handle stuff */ handle_stuff(); /* Recalculate interesting grids */ @@ -3813,16 +3629,11 @@ bool target_set(BIT_FLAGS mode) panel_col_min = x2; panel_bounds_center(); - /* Update stuff */ p_ptr->update |= (PU_MONSTERS); - /* Redraw map */ p_ptr->redraw |= (PR_MAP); - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD); - - /* Handle stuff */ handle_stuff(); /* Recalculate interesting grids */ @@ -3934,16 +3745,11 @@ bool target_set(BIT_FLAGS mode) /* Recenter the map around the player */ verify_panel(); - /* Update stuff */ p_ptr->update |= (PU_MONSTERS); - /* Redraw map */ p_ptr->redraw |= (PR_MAP); - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD); - - /* Handle stuff */ handle_stuff(); /* Recalculate interesting grids */ @@ -4061,16 +3867,11 @@ bool target_set(BIT_FLAGS mode) /* Recenter the map around the player */ verify_panel(); - /* Update stuff */ p_ptr->update |= (PU_MONSTERS); - /* Redraw map */ p_ptr->redraw |= (PR_MAP); - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD); - - /* Handle stuff */ handle_stuff(); /* Failure to set target */ @@ -4099,7 +3900,6 @@ bool get_aim_dir(DIRECTION *dp) cptr p; COMMAND_CODE code; - /* Initialize */ (*dp) = 0; /* Global direction */ @@ -4108,8 +3908,6 @@ bool get_aim_dir(DIRECTION *dp) /* Hack -- auto-target if requested */ if (use_old_target && target_okay()) dir = 5; -#ifdef ALLOW_REPEAT /* TNB */ - if (repeat_pull(&code)) { /* Confusion? */ @@ -4123,8 +3921,6 @@ bool get_aim_dir(DIRECTION *dp) } *dp = (DIRECTION)code; -#endif /* ALLOW_REPEAT -- TNB */ - /* Ask until satisfied */ while (!dir) { @@ -4198,7 +3994,6 @@ bool get_aim_dir(DIRECTION *dp) /* Check for confusion */ if (p_ptr->confused) { - /* XXX XXX XXX */ /* Random direction */ dir = ddd[randint0(8)]; } @@ -4213,59 +4008,33 @@ bool get_aim_dir(DIRECTION *dp) /* Save direction */ (*dp) = dir; -#ifdef ALLOW_REPEAT /* TNB */ - /* repeat_push(dir); */ repeat_push((COMMAND_CODE)command_dir); -#endif /* ALLOW_REPEAT -- TNB */ - /* A "valid" direction was entered */ return (TRUE); } - -/* - * Request a "movement" direction (1,2,3,4,6,7,8,9) from the user, - * and place it into "command_dir", unless we already have one. - * - * This function should be used for all "repeatable" commands, such as - * run, walk, open, close, bash, disarm, spike, tunnel, etc, as well - * as all commands which must reference a grid adjacent to the player, - * and which may not reference the grid under the player. Note that, - * for example, it is no longer possible to "disarm" or "open" chests - * in the same grid as the player. - * - * Direction "5" is illegal and will (cleanly) abort the command. - * - * This function tracks and uses the "global direction", and uses - * that as the "desired direction", to which "confusion" is applied. - */ -bool get_rep_dir(DIRECTION *dp, bool under) +bool get_direction(DIRECTION *dp, bool allow_under, bool with_steed) { DIRECTION dir; cptr prompt; COMMAND_CODE code; - /* Initialize */ (*dp) = 0; /* Global direction */ dir = command_dir; -#ifdef ALLOW_REPEAT /* TNB */ - if (repeat_pull(&code)) { dir = (DIRECTION)code; -/* return (TRUE); */ + /* return (TRUE); */ } *dp = (DIRECTION)code; -#endif /* ALLOW_REPEAT -- TNB */ - - if (under) + if (allow_under) { prompt = _("方向 ('.'足元, ESCで中断)? ", "Direction ('.' at feet, Escape to cancel)? "); } @@ -4273,7 +4042,7 @@ bool get_rep_dir(DIRECTION *dp, bool under) { prompt = _("方向 (ESCで中断)? ", "Direction (Escape to cancel)? "); } - + /* Get a direction */ while (!dir) { @@ -4283,7 +4052,7 @@ bool get_rep_dir(DIRECTION *dp, bool under) if (!get_com(prompt, &ch, TRUE)) break; /* Look down */ - if ((under) && ((ch == '5') || (ch == '-') || (ch == '.'))) + if ((allow_under) && ((ch == '5') || (ch == '-') || (ch == '.'))) { dir = 5; } @@ -4292,13 +4061,12 @@ bool get_rep_dir(DIRECTION *dp, bool under) /* Look up the direction */ dir = get_keymap_dir(ch); - /* Oops */ if (!dir) bell(); } } /* Prevent weirdness */ - if ((dir == 5) && (!under)) dir = 0; + if ((dir == 5) && (!allow_under)) dir = 0; /* Aborted */ if (!dir) return (FALSE); @@ -4316,7 +4084,7 @@ bool get_rep_dir(DIRECTION *dp, bool under) dir = ddd[randint0(8)]; } } - else if (p_ptr->riding) + else if (p_ptr->riding && with_steed) { monster_type *m_ptr = &m_list[p_ptr->riding]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; @@ -4370,31 +4138,40 @@ bool get_rep_dir(DIRECTION *dp, bool under) /* Save direction */ (*dp) = dir; -#ifdef ALLOW_REPEAT /* TNB */ - -/* repeat_push(dir); */ + /* repeat_push(dir); */ repeat_push((COMMAND_CODE)command_dir); -#endif /* ALLOW_REPEAT -- TNB */ - /* Success */ return (TRUE); } - -bool get_rep_dir2(DIRECTION *dp) +/* + * @brief 進行方向を指定する(騎乗対象の混乱の影響を受ける) / Request a "movement" direction (1,2,3,4,6,7,8,9) from the user, + * and place it into "command_dir", unless we already have one. + * + * This function should be used for all "repeatable" commands, such as + * run, walk, open, close, bash, disarm, spike, tunnel, etc, as well + * as all commands which must reference a grid adjacent to the player, + * and which may not reference the grid under the player. Note that, + * for example, it is no longer possible to "disarm" or "open" chests + * in the same grid as the player. + * + * Direction "5" is illegal and will (cleanly) abort the command. + * + * This function tracks and uses the "global direction", and uses + * that as the "desired direction", to which "confusion" is applied. + */ +bool get_rep_dir(DIRECTION *dp, bool under) { DIRECTION dir; + cptr prompt; COMMAND_CODE code; - /* Initialize */ (*dp) = 0; /* Global direction */ dir = command_dir; -#ifdef ALLOW_REPEAT /* TNB */ - if (repeat_pull(&code)) { dir = (DIRECTION)code; @@ -4402,25 +4179,39 @@ bool get_rep_dir2(DIRECTION *dp) } *dp = (DIRECTION)code; -#endif /* ALLOW_REPEAT -- TNB */ - + if (under) + { + prompt = _("方向 ('.'足元, ESCで中断)? ", "Direction ('.' at feet, Escape to cancel)? "); + } + else + { + prompt = _("方向 (ESCで中断)? ", "Direction (Escape to cancel)? "); + } + /* Get a direction */ while (!dir) { char ch; /* Get a command (or Cancel) */ - if (!get_com(_("方向 (ESCで中断)? ", "Direction (Escape to cancel)? "), &ch, TRUE)) break; + if (!get_com(prompt, &ch, TRUE)) break; - /* Look up the direction */ - dir = get_keymap_dir(ch); + /* Look down */ + if ((under) && ((ch == '5') || (ch == '-') || (ch == '.'))) + { + dir = 5; + } + else + { + /* Look up the direction */ + dir = get_keymap_dir(ch); - /* Oops */ - if (!dir) bell(); + if (!dir) bell(); + } } /* Prevent weirdness */ - if (dir == 5) dir = 0; + if ((dir == 5) && (!under)) dir = 0; /* Aborted */ if (!dir) return (FALSE); @@ -4438,24 +4229,63 @@ bool get_rep_dir2(DIRECTION *dp) dir = ddd[randint0(8)]; } } + else if (p_ptr->riding) + { + monster_type *m_ptr = &m_list[p_ptr->riding]; + monster_race *r_ptr = &r_info[m_ptr->r_idx]; + + if (MON_CONFUSED(m_ptr)) + { + /* Standard confusion */ + if (randint0(100) < 75) + { + /* Random direction */ + dir = ddd[randint0(8)]; + } + } + else if ((r_ptr->flags1 & RF1_RAND_50) && (r_ptr->flags1 & RF1_RAND_25) && (randint0(100) < 50)) + { + /* Random direction */ + dir = ddd[randint0(8)]; + } + else if ((r_ptr->flags1 & RF1_RAND_50) && (randint0(100) < 25)) + { + /* Random direction */ + dir = ddd[randint0(8)]; + } + } /* Notice confusion */ if (command_dir != dir) { - /* Warn the user */ - msg_print(_("あなたは混乱している。", "You are confused.")); + if (p_ptr->confused) + { + /* Warn the user */ + msg_print(_("あなたは混乱している。", "You are confused.")); + } + else + { + char m_name[80]; + monster_type *m_ptr = &m_list[p_ptr->riding]; + + monster_desc(m_name, m_ptr, 0); + if (MON_CONFUSED(m_ptr)) + { + msg_format(_("%sは混乱している。", "%^s is confusing."), m_name); + } + else + { + msg_format(_("%sは思い通りに動いてくれない。", "You cannot control %s."), m_name); + } + } } /* Save direction */ (*dp) = dir; -#ifdef ALLOW_REPEAT /* TNB */ - /* repeat_push(dir); */ repeat_push((COMMAND_CODE)command_dir); -#endif /* ALLOW_REPEAT -- TNB */ - /* Success */ return (TRUE); } @@ -4583,8 +4413,6 @@ void gain_level_reward(int chosen_reward) msg_format(_("%sの声が響き渡った:", "The voice of %s booms out:"), chaos_patrons[p_ptr->chaos_patron]); msg_print(_("「汝の行いは貴き剣に値せり。」", "'Thy deed hath earned thee a worthy blade.'")); - - /* Get local object */ q_ptr = &forge; dummy = TV_SWORD; switch (randint1(p_ptr->lev)) @@ -5070,7 +4898,6 @@ static bool tgt_pt_accept(POSITION y, POSITION x) if (cave_have_flag_grid(c_ptr, FF_QUEST_EXIT)) return (TRUE); } - /* Nope */ return (FALSE); } @@ -5123,7 +4950,6 @@ bool tgt_pt(POSITION *x_ptr, POSITION *y_ptr) int wid, hgt; - /* Get size */ get_screen_size(&wid, &hgt); x = p_ptr->x; @@ -5191,16 +5017,11 @@ bool tgt_pt(POSITION *x_ptr, POSITION *y_ptr) x = p_ptr->x; verify_panel(); /* Move cursor to player */ - /* Update stuff */ p_ptr->update |= (PU_MONSTERS); - /* Redraw map */ p_ptr->redraw |= (PR_MAP); - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD); - - /* Handle stuff */ handle_stuff(); } else /* move cursor to next stair and change panel */ @@ -5282,16 +5103,11 @@ bool tgt_pt(POSITION *x_ptr, POSITION *y_ptr) /* Recenter the map around the player */ verify_panel(); - /* Update stuff */ p_ptr->update |= (PU_MONSTERS); - /* Redraw map */ p_ptr->redraw |= (PR_MAP); - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD); - - /* Handle stuff */ handle_stuff(); *x_ptr = x; @@ -5306,7 +5122,6 @@ bool get_hack_dir(DIRECTION *dp) cptr p; char command; - /* Initialize */ (*dp) = 0; /* Global direction */ @@ -5383,7 +5198,6 @@ bool get_hack_dir(DIRECTION *dp) /* Check for confusion */ if (p_ptr->confused) { - /* XXX XXX XXX */ /* Random direction */ dir = ddd[randint0(8)]; }