X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fspells1.c;h=fc5baa2961322aa81664851830c615bdd43450bd;hb=98225695dd8c03500d7d823ed8b711f8bcd70e4d;hp=141ee26c98b7cc23eecf82b1f01530072a3145b8;hpb=b6f82f2b24a4692ebe44a086cbe30b4bc908e292;p=hengband%2Fhengband.git diff --git a/src/spells1.c b/src/spells1.c index 141ee26c9..fc5baa296 100644 --- a/src/spells1.c +++ b/src/spells1.c @@ -16,8 +16,21 @@ #include "trap.h" #include "object-curse.h" #include "player-damage.h" + +#include "monster.h" +#include "monster-status.h" +#include "spells-summon.h" #include "monsterrace-hook.h" +#include "melee.h" +#include "world.h" +#include "projection.h" +#include "mutation.h" +#include "rooms.h" +#include "artifact.h" +#include "avatar.h" +#include "player-status.h" + static int rakubadam_m; /*!< 振り落とされた際のダメージ量 */ static int rakubadam_p; /*!< 落馬した際のダメージ量 */ @@ -109,9 +122,9 @@ PERCENTAGE beam_chance(void) * @param cury 現在の鏡のy座標 * @param curx 現在の鏡のx座標 */ -static void next_mirror(int* next_y, int* next_x, int cury, int curx) +static void next_mirror(POSITION* next_y, POSITION* next_x, POSITION cury, POSITION curx) { - int mirror_x[10], mirror_y[10]; /* 鏡はもっと少ない */ + POSITION mirror_x[10], mirror_y[10]; /* 鏡はもっと少ない */ int mirror_num = 0; /* 鏡の数 */ POSITION x, y; int num; @@ -248,7 +261,7 @@ static TERM_COLOR spell_color(int type) SYMBOL_CODE c; /* Lookup the default colors for this type */ - cptr s = quark_str(gf_color[type]); + concptr s = quark_str(gf_color[type]); if (!s) return (TERM_WHITE); @@ -325,350 +338,6 @@ u16b bolt_pict(POSITION y, POSITION x, POSITION ny, POSITION nx, EFFECT_ID typ) } -/*! - * @brief 始点から終点への経路を返す / - * Determine the path taken by a projection. - * @param gp 経路座標リストを返す参照ポインタ - * @param range 距離 - * @param y1 始点Y座標 - * @param x1 始点X座標 - * @param y2 終点Y座標 - * @param x2 終点X座標 - * @param flg フラグID - * @return リストの長さ - * @details - *
- * The projection will always start from the grid (y1,x1), and will travel
- * towards the grid (y2,x2), touching one grid per unit of distance along
- * the major axis, and stopping when it enters the destination grid or a
- * wall grid, or has travelled the maximum legal distance of "range".
- *
- * Note that "distance" in this function (as in the "update_view()" code)
- * is defined as "MAX(dy,dx) + MIN(dy,dx)/2", which means that the player
- * actually has an "octagon of projection" not a "circle of projection".
- *
- * The path grids are saved into the grid array pointed to by "gp", and
- * there should be room for at least "range" grids in "gp".  Note that
- * due to the way in which distance is calculated, this function normally
- * uses fewer than "range" grids for the projection path, so the result
- * of this function should never be compared directly to "range".  Note
- * that the initial grid (y1,x1) is never saved into the grid array, not
- * even if the initial grid is also the final grid.  
- *
- * The "flg" flags can be used to modify the behavior of this function.
- *
- * In particular, the "PROJECT_STOP" and "PROJECT_THRU" flags have the same
- * semantics as they do for the "project" function, namely, that the path
- * will stop as soon as it hits a monster, or that the path will continue
- * through the destination grid, respectively.
- *
- * The "PROJECT_JUMP" flag, which for the "project()" function means to
- * start at a special grid (which makes no sense in this function), means
- * that the path should be "angled" slightly if needed to avoid any wall
- * grids, allowing the player to "target" any grid which is in "view".
- * This flag is non-trivial and has not yet been implemented, but could
- * perhaps make use of the "vinfo" array (above).  
- *
- * This function returns the number of grids (if any) in the path.  This
- * function will return zero if and only if (y1,x1) and (y2,x2) are equal.
- *
- * This algorithm is similar to, but slightly different from, the one used
- * by "update_view_los()", and very different from the one used by "los()".
- * 
- */ -sint project_path(u16b *gp, POSITION range, POSITION y1, POSITION x1, POSITION y2, POSITION x2, BIT_FLAGS flg) -{ - POSITION y, x; - - int n = 0; - int k = 0; - - /* Absolute */ - POSITION ay, ax; - - /* Offsets */ - POSITION sy, sx; - - /* Fractions */ - int frac; - - /* Scale factors */ - int full, half; - - /* Slope */ - int m; - - /* No path necessary (or allowed) */ - if ((x1 == x2) && (y1 == y2)) return (0); - - - /* Analyze "dy" */ - if (y2 < y1) - { - ay = (y1 - y2); - sy = -1; - } - else - { - ay = (y2 - y1); - sy = 1; - } - - /* Analyze "dx" */ - if (x2 < x1) - { - ax = (x1 - x2); - sx = -1; - } - else - { - ax = (x2 - x1); - sx = 1; - } - - - /* Number of "units" in one "half" grid */ - half = (ay * ax); - - /* Number of "units" in one "full" grid */ - full = half << 1; - - /* Vertical */ - if (ay > ax) - { - /* Let m = ((dx/dy) * full) = (dx * dx * 2) */ - m = ax * ax * 2; - - /* Start */ - y = y1 + sy; - x = x1; - - frac = m; - - if (frac > half) - { - /* Advance (X) part 2 */ - x += sx; - - /* Advance (X) part 3 */ - frac -= full; - - /* Track distance */ - k++; - } - - /* Create the projection path */ - while (1) - { - /* Save grid */ - gp[n++] = GRID(y, x); - - /* Hack -- Check maximum range */ - if ((n + (k >> 1)) >= range) break; - - /* Sometimes stop at destination grid */ - if (!(flg & (PROJECT_THRU))) - { - if ((x == x2) && (y == y2)) break; - } - - if (flg & (PROJECT_DISI)) - { - if ((n > 0) && cave_stop_disintegration(y, x)) break; - } - else if (flg & (PROJECT_LOS)) - { - if ((n > 0) && !cave_los_bold(y, x)) break; - } - else if (!(flg & (PROJECT_PATH))) - { - /* Always stop at non-initial wall grids */ - if ((n > 0) && !cave_have_flag_bold(y, x, FF_PROJECT)) break; - } - - /* Sometimes stop at non-initial monsters/players */ - if (flg & (PROJECT_STOP)) - { - if ((n > 0) && - (player_bold(y, x) || cave[y][x].m_idx != 0)) - break; - } - - if (!in_bounds(y, x)) break; - - /* Slant */ - if (m) - { - /* Advance (X) part 1 */ - frac += m; - - /* Horizontal change */ - if (frac > half) - { - /* Advance (X) part 2 */ - x += sx; - - /* Advance (X) part 3 */ - frac -= full; - - /* Track distance */ - k++; - } - } - - /* Advance (Y) */ - y += sy; - } - } - - /* Horizontal */ - else if (ax > ay) - { - /* Let m = ((dy/dx) * full) = (dy * dy * 2) */ - m = ay * ay * 2; - - /* Start */ - y = y1; - x = x1 + sx; - - frac = m; - - /* Vertical change */ - if (frac > half) - { - /* Advance (Y) part 2 */ - y += sy; - - /* Advance (Y) part 3 */ - frac -= full; - - /* Track distance */ - k++; - } - - /* Create the projection path */ - while (1) - { - /* Save grid */ - gp[n++] = GRID(y, x); - - /* Hack -- Check maximum range */ - if ((n + (k >> 1)) >= range) break; - - /* Sometimes stop at destination grid */ - if (!(flg & (PROJECT_THRU))) - { - if ((x == x2) && (y == y2)) break; - } - - if (flg & (PROJECT_DISI)) - { - if ((n > 0) && cave_stop_disintegration(y, x)) break; - } - else if (flg & (PROJECT_LOS)) - { - if ((n > 0) && !cave_los_bold(y, x)) break; - } - else if (!(flg & (PROJECT_PATH))) - { - /* Always stop at non-initial wall grids */ - if ((n > 0) && !cave_have_flag_bold(y, x, FF_PROJECT)) break; - } - - /* Sometimes stop at non-initial monsters/players */ - if (flg & (PROJECT_STOP)) - { - if ((n > 0) && - (player_bold(y, x) || cave[y][x].m_idx != 0)) - break; - } - - if (!in_bounds(y, x)) break; - - /* Slant */ - if (m) - { - /* Advance (Y) part 1 */ - frac += m; - - /* Vertical change */ - if (frac > half) - { - /* Advance (Y) part 2 */ - y += sy; - - /* Advance (Y) part 3 */ - frac -= full; - - /* Track distance */ - k++; - } - } - - /* Advance (X) */ - x += sx; - } - } - - /* Diagonal */ - else - { - /* Start */ - y = y1 + sy; - x = x1 + sx; - - /* Create the projection path */ - while (1) - { - /* Save grid */ - gp[n++] = GRID(y, x); - - /* Hack -- Check maximum range */ - if ((n + (n >> 1)) >= range) break; - - /* Sometimes stop at destination grid */ - if (!(flg & (PROJECT_THRU))) - { - if ((x == x2) && (y == y2)) break; - } - - if (flg & (PROJECT_DISI)) - { - if ((n > 0) && cave_stop_disintegration(y, x)) break; - } - else if (flg & (PROJECT_LOS)) - { - if ((n > 0) && !cave_los_bold(y, x)) break; - } - else if (!(flg & (PROJECT_PATH))) - { - /* Always stop at non-initial wall grids */ - if ((n > 0) && !cave_have_flag_bold(y, x, FF_PROJECT)) break; - } - - /* Sometimes stop at non-initial monsters/players */ - if (flg & (PROJECT_STOP)) - { - if ((n > 0) && - (player_bold(y, x) || cave[y][x].m_idx != 0)) - break; - } - - if (!in_bounds(y, x)) break; - - /* Advance (Y) */ - y += sy; - - /* Advance (X) */ - x += sx; - } - } - - /* Length */ - return (n); -} - - /* * Mega-Hack -- track "affected" monsters (see "project()" comments) @@ -723,7 +392,7 @@ static bool project_f(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P if (have_flag(f_ptr->flags, FF_TREE)) { - cptr message; + concptr message; switch (typ) { case GF_POIS: @@ -1261,7 +930,7 @@ static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P BIT_FLAGS flgs[TR_FLAG_SIZE]; - char o_name[MAX_NLEN]; + GAME_TEXT o_name[MAX_NLEN]; KIND_OBJECT_IDX k_idx = 0; bool is_potion = FALSE; @@ -1282,7 +951,7 @@ static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P bool ignore = FALSE; bool do_kill = FALSE; - cptr note_kill = NULL; + concptr note_kill = NULL; #ifndef JP /* Get the "plural"-ness */ @@ -1291,8 +960,6 @@ static bool project_o(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P /* Acquire next object */ next_o_idx = o_ptr->next_o_idx; - - /* Extract the flags */ object_flags(o_ptr, flgs); /* Check for artifact */ @@ -1685,16 +1352,16 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P bool heal_leper = FALSE; /* Hold the monster name */ - char m_name[80]; + GAME_TEXT m_name[MAX_NLEN]; char m_poss[10]; PARAMETER_VALUE photo = 0; /* Assume no note */ - cptr note = NULL; + concptr note = NULL; /* Assume a default death */ - cptr note_dies = extract_note_dies(real_r_idx(m_ptr)); + concptr note_dies = extract_note_dies(real_r_idx(m_ptr)); POSITION ty = m_ptr->fy; POSITION tx = m_ptr->fx; @@ -2565,8 +2232,8 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P else if (dam > 0) { int b = damroll(5, dam) / 4; - cptr str = (p_ptr->pclass == CLASS_MINDCRAFTER) ? _("超能力パワー", "psychic energy") : _("魔力", "mana"); - cptr msg = _("あなたは%sの苦痛を%sに変換した!", + concptr str = (p_ptr->pclass == CLASS_MINDCRAFTER) ? _("超能力パワー", "psychic energy") : _("魔力", "mana"); + concptr msg = _("あなたは%sの苦痛を%sに変換した!", (seen ? "You convert %s's pain into %s!" : "You convert %ss pain into %s!")); msg_format(msg, m_name, str); @@ -4032,7 +3699,6 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P /* Special message */ if (see_s_msg) { - /* Get the monster name */ monster_desc(killer, caster_ptr, 0); msg_format(_("%^sは気分が良さそうだ。", "%^s appears healthier."), killer); } @@ -4860,7 +4526,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname) { - char m2_name[80]; + char m2_name[MAX_NLEN]; monster_desc(m2_name, m_ptr, MD_INDEF_VISIBLE); do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_HEAL_LEPER, m2_name); @@ -4900,11 +4566,9 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P if (((dam > 0) || get_angry) && !do_sleep) anger_monster(m_ptr); - /* Take note */ if ((fear || do_fear) && seen) { sound(SOUND_FLEE); - msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), m_name); } @@ -4964,7 +4628,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P if (pet) mode |= PM_FORCE_PET; else mode |= (PM_NO_PET | PM_FORCE_FRIENDLY); - count += summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (pet ? p_ptr->lev*2/3+randint1(p_ptr->lev/2) : dun_level), 0, mode); + count += summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (pet ? p_ptr->lev*2/3+randint1(p_ptr->lev/2) : dun_level), 0, mode, '\0'); if (!one_in_(6)) break; } case 23: case 24: case 25: @@ -4979,7 +4643,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P int i = 0; if (one_in_(13)) { - while (i < 6) + while (i < A_MAX) { do { @@ -5005,7 +4669,7 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P { p_ptr->health_who = c_ptr->m_idx; p_ptr->redraw |= (PR_HEALTH); - redraw_stuff(); + handle_stuff(); } /* Verify this code */ @@ -5056,8 +4720,6 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P /* Mark the item as fully known */ q_ptr->ident |= (IDENT_MENTAL); - - /* Drop it in the dungeon */ (void)drop_near(q_ptr, -1, p_ptr->y, p_ptr->x); } @@ -5094,10 +4756,10 @@ static bool project_m(MONSTER_IDX who, POSITION r, POSITION y, POSITION x, HIT_P * We return "TRUE" if any "obvious" effects were observed. XXX XXX Actually, * we just assume that the effects were obvious, for historical reasons. */ -static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ, BIT_FLAGS flg, int monspell) +static bool project_p(MONSTER_IDX who, concptr who_name, int r, POSITION y, POSITION x, HIT_POINT dam, EFFECT_ID typ, BIT_FLAGS flg, int monspell) { int k = 0; - int rlev = 0; + DEPTH rlev = 0; /* Hack -- assume obvious */ bool obvious = TRUE; @@ -5112,13 +4774,13 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO monster_type *m_ptr = NULL; /* Monster name (for attacks) */ - char m_name[80]; + GAME_TEXT m_name[MAX_NLEN]; /* Monster name (for damage) */ char killer[80]; /* Hack -- messages */ - cptr act = NULL; + concptr act = NULL; int get_damage = 0; @@ -5191,12 +4853,8 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO if (who > 0) { - /* Get the source monster */ m_ptr = &m_list[who]; - /* Extract the monster level */ rlev = (((&r_info[m_ptr->r_idx])->level >= 1) ? (&r_info[m_ptr->r_idx])->level : 1); - - /* Get the monster name */ monster_desc(m_name, m_ptr, 0); /* Get the monster's real name (gotten before polymorph!) */ @@ -5267,8 +4925,7 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO if (p_ptr->resist_pois) dam = (dam + 2) / 3; if (double_resist) dam = (dam + 2) / 3; - if ((!(double_resist || p_ptr->resist_pois)) && - one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW()) + if ((!(double_resist || p_ptr->resist_pois)) && one_in_(HURT_CHANCE) && !CHECK_MULTISHADOW()) { do_dec_stat(A_CON); } @@ -5369,9 +5026,7 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO (void)set_stun(p_ptr->stun + plus_stun); } - if (!(p_ptr->resist_fire || - IS_OPPOSE_FIRE() || - p_ptr->immune_fire)) + if (!(p_ptr->resist_fire || IS_OPPOSE_FIRE() || p_ptr->immune_fire)) { inven_damage(set_acid_destroy, 3); } @@ -5412,19 +5067,21 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO if (fuzzy) msg_print(_("何か湿ったもので攻撃された!", "You are hit by something wet!")); if (!CHECK_MULTISHADOW()) { - if (!p_ptr->resist_sound) + if (!p_ptr->resist_sound && !p_ptr->resist_water) { set_stun(p_ptr->stun + randint1(40)); } - if (!p_ptr->resist_conf) + if (!p_ptr->resist_conf && !p_ptr->resist_water) { set_confused(p_ptr->confused + randint1(5) + 5); } - if (one_in_(5)) + if (one_in_(5) && !p_ptr->resist_water) { inven_damage(set_cold_destroy, 3); } + + if (p_ptr->resist_water) get_damage /= 4; } get_damage = take_hit(DAMAGE_ATTACK, dam, killer, monspell); @@ -5645,13 +5302,9 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO msg_print(_("閃光のため非物質的な影の存在でいられなくなった。", "The light forces you out of your incorporeal shadow form.")); - p_ptr->redraw |= PR_MAP; + p_ptr->redraw |= (PR_MAP | PR_STATUS); p_ptr->update |= (PU_MONSTERS); p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); - - /* Redraw status bar */ - p_ptr->redraw |= (PR_STATUS); - } break; @@ -5723,7 +5376,7 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO msg_print(_("あなたは以前ほど力強くなくなってしまった...。", "You're not as powerful as you used to be...")); - for (k = 0; k < 6; k++) + for (k = 0; k < A_MAX; k++) { p_ptr->stat_cur[k] = (p_ptr->stat_cur[k] * 7) / 8; if (p_ptr->stat_cur[k] < 3) p_ptr->stat_cur[k] = 3; @@ -5946,9 +5599,7 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO learn_spell(monspell); p_ptr->redraw |= (PR_MANA); - - p_ptr->window |= (PW_PLAYER); - p_ptr->window |= (PW_SPELL); + p_ptr->window |= (PW_PLAYER | PW_SPELL); if (who > 0) { @@ -6171,7 +5822,7 @@ static bool project_p(MONSTER_IDX who, cptr who_name, int r, POSITION y, POSITIO if ((p_ptr->tim_eyeeye || hex_spelling(HEX_EYE_FOR_EYE)) && (get_damage > 0) && !p_ptr->is_dead && (who > 0)) { - char m_name_self[80]; + GAME_TEXT m_name_self[80]; /* hisself */ monster_desc(m_name_self, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE | MD_OBJECTIVE); @@ -6235,27 +5886,13 @@ POSITION dist_to_line(POSITION y, POSITION x, POSITION y1, POSITION x1, POSITION */ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) { - /* Delta */ - POSITION dx, dy; - - /* Absolute */ - POSITION ax, ay; - - /* Signs */ - POSITION sx, sy; - - /* Fractions */ - POSITION qx, qy; - - /* Scanners */ - POSITION tx, ty; - - /* Scale factors */ - POSITION f1, f2; - - /* Slope, or 1/Slope, of LOS */ - POSITION m; - + POSITION dx, dy; /* Delta */ + POSITION ax, ay; /* Absolute */ + POSITION sx, sy; /* Signs */ + POSITION qx, qy; /* Fractions */ + POSITION tx, ty; /* Scanners */ + POSITION f1, f2; /* Scale factors */ + POSITION m; /* Slope, or 1/Slope, of LOS */ /* Extract the offset */ dy = y2 - y1; @@ -6265,15 +5902,12 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) ay = ABS(dy); ax = ABS(dx); - /* Handle adjacent (or identical) grids */ if ((ax < 2) && (ay < 2)) return (TRUE); - /* Paranoia -- require "safe" origin */ /* if (!in_bounds(y1, x1)) return (FALSE); */ - /* Directly South/North */ if (!dx) { @@ -6324,12 +5958,10 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) return (TRUE); } - /* Extract some signs */ sx = (dx < 0) ? -1 : 1; sy = (dy < 0) ? -1 : 1; - /* Vertical "knights" */ if (ax == 1) { @@ -6348,7 +5980,6 @@ bool in_disintegration_range(POSITION y1, POSITION x1, POSITION y2, POSITION x2) } } - /* Calculate scale factor div 2 */ f2 = (ax * ay); @@ -6740,7 +6371,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da bool jump = FALSE; /* Attacker's name (prepared before polymorph)*/ - char who_name[80]; + GAME_TEXT who_name[MAX_NLEN]; /* Can the player see the source of this effect? */ bool see_s_msg = TRUE; @@ -6886,8 +6517,8 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da { u16b p; - byte a; - char c; + TERM_COLOR a; + SYMBOL_CODE c; /* Obtain the bolt pict */ p = bolt_pict(oy, ox, y, x, typ); @@ -6929,37 +6560,37 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da Term_xtra(TERM_XTRA_DELAY, msec); } } - if(project_o(0,0,y,x,dam,GF_SEEKER))notice=TRUE; - if( is_mirror_grid(&cave[y][x])) + if (project_o(0, 0, y, x, dam, GF_SEEKER))notice = TRUE; + if (is_mirror_grid(&cave[y][x])) { - /* The target of monsterspell becomes tha mirror(broken) */ - monster_target_y=(s16b)y; - monster_target_x=(s16b)x; + /* The target of monsterspell becomes tha mirror(broken) */ + monster_target_y = y; + monster_target_x = x; remove_mirror(y, x); next_mirror(&oy, &ox, y, x); - path_n = i+project_path(&(path_g[i+1]), (project_length ? project_length : MAX_RANGE), y, x, oy, ox, flg); - for(j = last_i; j <= i; j++) + path_n = i + project_path(&(path_g[i + 1]), (project_length ? project_length : MAX_RANGE), y, x, oy, ox, flg); + for (j = last_i; j <= i; j++) { y = GRID_Y(path_g[j]); x = GRID_X(path_g[j]); - if(project_m(0, 0, y, x, dam, GF_SEEKER, flg, TRUE)) notice=TRUE; - if(!who && (project_m_n==1) && !jump ){ - if(cave[project_m_y][project_m_x].m_idx >0 ){ - monster_type *m_ptr = &m_list[cave[project_m_y][project_m_x].m_idx]; + if (project_m(0, 0, y, x, dam, GF_SEEKER, flg, TRUE)) notice = TRUE; + if (!who && (project_m_n == 1) && !jump) { + if (cave[project_m_y][project_m_x].m_idx > 0) { + monster_type *m_ptr = &m_list[cave[project_m_y][project_m_x].m_idx]; - if (m_ptr->ml) - { - /* Hack -- auto-recall */ - if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx); + if (m_ptr->ml) + { + /* Hack -- auto-recall */ + if (!p_ptr->image) monster_race_track(m_ptr->ap_r_idx); - /* Hack - auto-track */ - health_track(cave[project_m_y][project_m_x].m_idx); + /* Hack - auto-track */ + health_track(cave[project_m_y][project_m_x].m_idx); + } } - } } - (void)project_f(0,0,y,x,dam,GF_SEEKER); + (void)project_f(0, 0, y, x, dam, GF_SEEKER); } last_i = i; } @@ -6969,10 +6600,10 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da POSITION py, px; py = GRID_Y(path_g[i]); px = GRID_X(path_g[i]); - if(project_m(0, 0, py, px, dam, GF_SEEKER, flg, TRUE)) + if (project_m(0, 0, py, px, dam, GF_SEEKER, flg, TRUE)) notice = TRUE; - if(!who && (project_m_n==1) && !jump ){ - if(cave[project_m_y][project_m_x].m_idx > 0) + if (!who && (project_m_n == 1) && !jump) { + if (cave[project_m_y][project_m_x].m_idx > 0) { monster_type *m_ptr = &m_list[cave[project_m_y][project_m_x].m_idx]; @@ -7025,7 +6656,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da u16b p; TERM_COLOR a; - char c; + SYMBOL_CODE c; /* Obtain the bolt pict */ p = bolt_pict(oy, ox, y, x, typ); @@ -7168,8 +6799,8 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da { u16b p; - byte a; - char c; + TERM_COLOR a; + SYMBOL_CODE c; /* Obtain the bolt pict */ p = bolt_pict(oy, ox, y, x, typ); @@ -7331,7 +6962,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da u16b p; TERM_COLOR a; - char c; + SYMBOL_CODE c; drawn = TRUE; @@ -7385,10 +7016,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da } } - - /* Update stuff if needed */ - if (p_ptr->update) update_stuff(); - + update_creature(p_ptr); if (flg & PROJECT_KILL) { @@ -7429,8 +7057,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da } } - /* Update stuff if needed */ - if (p_ptr->update) update_stuff(); + update_creature(p_ptr); /* Check objects */ if (flg & (PROJECT_ITEM)) @@ -7729,7 +7356,7 @@ bool project(MONSTER_IDX who, POSITION rad, POSITION y, POSITION x, HIT_POINT da if (p_ptr->riding) { - char m_name[80]; + GAME_TEXT m_name[MAX_NLEN]; monster_desc(m_name, &m_list[p_ptr->riding], 0);