static bool calc_vertical_projection(player_type *player_ptr, projection_path_type *pp_ptr)
{
- if (pp_ptr->ay > pp_ptr->ax)
+ if (pp_ptr->ay <= pp_ptr->ax)
return FALSE;
pp_ptr->m = pp_ptr->ax * pp_ptr->ax * 2;
return TRUE;
}
+static bool calc_horizontal_projection(player_type *player_ptr, projection_path_type *pp_ptr)
+{
+ if (pp_ptr->ax <= pp_ptr->ay)
+ return FALSE;
+
+ pp_ptr->m = pp_ptr->ay * pp_ptr->ay * 2;
+ pp_ptr->y = pp_ptr->y1;
+ pp_ptr->x = pp_ptr->x1 + pp_ptr->sx;
+ pp_ptr->frac = pp_ptr->m;
+ if (pp_ptr->frac > pp_ptr->half) {
+ pp_ptr->y += pp_ptr->sy;
+ pp_ptr->frac -= pp_ptr->full;
+ pp_ptr->k++;
+ }
+
+ floor_type *floor_ptr = player_ptr->current_floor_ptr;
+ while (TRUE) {
+ pp_ptr->gp[pp_ptr->n++] = location_to_grid(pp_ptr->y, pp_ptr->x);
+ if ((pp_ptr->n + (pp_ptr->k >> 1)) >= pp_ptr->range)
+ break;
+
+ if (!(pp_ptr->flag & PROJECT_THRU)) {
+ if ((pp_ptr->x == pp_ptr->x2) && (pp_ptr->y == pp_ptr->y2))
+ break;
+ }
+
+ if (pp_ptr->flag & PROJECT_DISI) {
+ if ((pp_ptr->n > 0) && cave_stop_disintegration(floor_ptr, pp_ptr->y, pp_ptr->x))
+ break;
+ } else if (pp_ptr->flag & PROJECT_LOS) {
+ if ((pp_ptr->n > 0) && !cave_los_bold(floor_ptr, pp_ptr->y, pp_ptr->x))
+ break;
+ } else if (!(pp_ptr->flag & PROJECT_PATH)) {
+ if ((pp_ptr->n > 0) && !cave_have_flag_bold(floor_ptr, pp_ptr->y, pp_ptr->x, FF_PROJECT))
+ break;
+ }
+
+ if (pp_ptr->flag & PROJECT_STOP) {
+ if ((pp_ptr->n > 0) && (player_bold(player_ptr, pp_ptr->y, pp_ptr->x) || floor_ptr->grid_array[pp_ptr->y][pp_ptr->x].m_idx != 0))
+ break;
+ }
+
+ if (!in_bounds(floor_ptr, pp_ptr->y, pp_ptr->x))
+ break;
+
+ if (pp_ptr->m) {
+ pp_ptr->frac += pp_ptr->m;
+ if (pp_ptr->frac > pp_ptr->half) {
+ pp_ptr->y += pp_ptr->sy;
+ pp_ptr->frac -= pp_ptr->full;
+ pp_ptr->k++;
+ }
+ }
+
+ pp_ptr->x += pp_ptr->sx;
+ }
+
+ return TRUE;
+}
+
/*!
* @brief \8en\93_\82©\82ç\8fI\93_\82Ö\82Ì\92¼\90ü\8co\98H\82ð\95Ô\82· /
* Determine the path taken by a projection.
if (calc_vertical_projection(player_ptr, pp_ptr))
return pp_ptr->n;
- /* Horizontal */
- if (pp_ptr->ax > pp_ptr->ay) {
- pp_ptr->m = pp_ptr->ay * pp_ptr->ay * 2;
- pp_ptr->y = y1;
- pp_ptr->x = x1 + pp_ptr->sx;
- pp_ptr->frac = pp_ptr->m;
- if (pp_ptr->frac > pp_ptr->half) {
- pp_ptr->y += pp_ptr->sy;
- pp_ptr->frac -= pp_ptr->full;
- pp_ptr->k++;
- }
-
- floor_type *floor_ptr = player_ptr->current_floor_ptr;
- while (TRUE) {
- gp[pp_ptr->n++] = location_to_grid(pp_ptr->y, pp_ptr->x);
- if ((pp_ptr->n + (pp_ptr->k >> 1)) >= range)
- break;
-
- if (!(flag & (PROJECT_THRU))) {
- if ((pp_ptr->x == x2) && (pp_ptr->y == y2))
- break;
- }
-
- if (flag & (PROJECT_DISI)) {
- if ((pp_ptr->n > 0) && cave_stop_disintegration(floor_ptr, pp_ptr->y, pp_ptr->x))
- break;
- } else if (flag & (PROJECT_LOS)) {
- if ((pp_ptr->n > 0) && !cave_los_bold(floor_ptr, pp_ptr->y, pp_ptr->x))
- break;
- } else if (!(flag & (PROJECT_PATH))) {
- if ((pp_ptr->n > 0) && !cave_have_flag_bold(floor_ptr, pp_ptr->y, pp_ptr->x, FF_PROJECT))
- break;
- }
-
- if (flag & (PROJECT_STOP)) {
- if ((pp_ptr->n > 0) && (player_bold(player_ptr, pp_ptr->y, pp_ptr->x) || floor_ptr->grid_array[pp_ptr->y][pp_ptr->x].m_idx != 0))
- break;
- }
-
- if (!in_bounds(floor_ptr, pp_ptr->y, pp_ptr->x))
- break;
-
- if (pp_ptr->m) {
- pp_ptr->frac += pp_ptr->m;
- if (pp_ptr->frac > pp_ptr->half) {
- pp_ptr->y += pp_ptr->sy;
- pp_ptr->frac -= pp_ptr->full;
- pp_ptr->k++;
- }
- }
-
- pp_ptr->x += pp_ptr->sx;
- }
-
+ if (calc_horizontal_projection(player_ptr, pp_ptr))
return pp_ptr->n;
- }
pp_ptr->y = y1 + pp_ptr->sy;
pp_ptr->x = x1 + pp_ptr->sx;