OSDN Git Service

[Refactor] #37353 map_area() を spells-floor.c/h へ移動。
[hengband/hengband.git] / src / spells-floor.c
index b6b34b5..228c526 100644 (file)
@@ -1,6 +1,9 @@
 #include "angband.h"
 #include "floor.h"
 #include "spells-floor.h"
+#include "grid.h"
+#include "quest.h"
+#include "cmd-basic.h"
 
 /*
  * Light up the dungeon using "clairvoyance"
@@ -240,3 +243,191 @@ bool place_mirror(void)
 
        return TRUE;
 }
+
+/*!
+ * @brief プレイヤーの手による能動的な階段生成処理 /
+ * Create stairs at or move previously created stairs into the player location.
+ * @return なし
+ */
+void stair_creation(void)
+{
+       saved_floor_type *sf_ptr;
+       saved_floor_type *dest_sf_ptr;
+
+       bool up = TRUE;
+       bool down = TRUE;
+       FLOOR_IDX dest_floor_id = 0;
+
+
+       /* Forbid up staircases on Ironman mode */
+       if (ironman_downward) up = FALSE;
+
+       /* Forbid down staircases on quest level */
+       if (quest_number(current_floor_ptr->dun_level) || (current_floor_ptr->dun_level >= d_info[p_ptr->dungeon_idx].maxdepth)) down = FALSE;
+
+       /* No effect out of standard dungeon floor */
+       if (!current_floor_ptr->dun_level || (!up && !down) ||
+               (p_ptr->inside_quest && is_fixed_quest_idx(p_ptr->inside_quest)) ||
+               p_ptr->inside_arena || p_ptr->inside_battle)
+       {
+               /* arena or quest */
+               msg_print(_("効果がありません!", "There is no effect!"));
+               return;
+       }
+
+       /* Artifacts resists */
+       if (!cave_valid_bold(p_ptr->y, p_ptr->x))
+       {
+               msg_print(_("床上のアイテムが呪文を跳ね返した。", "The object resists the spell."));
+               return;
+       }
+
+       /* Destroy all objects in the grid */
+       delete_object(p_ptr->y, p_ptr->x);
+
+       /* Extract current floor data */
+       sf_ptr = get_sf_ptr(p_ptr->floor_id);
+       if (!sf_ptr)
+       {
+               /* No floor id? -- Create now! */
+               p_ptr->floor_id = get_new_floor_id();
+               sf_ptr = get_sf_ptr(p_ptr->floor_id);
+       }
+
+       /* Choose randomly */
+       if (up && down)
+       {
+               if (randint0(100) < 50) up = FALSE;
+               else down = FALSE;
+       }
+
+       /* Destination is already fixed */
+       if (up)
+       {
+               if (sf_ptr->upper_floor_id) dest_floor_id = sf_ptr->upper_floor_id;
+       }
+       else
+       {
+               if (sf_ptr->lower_floor_id) dest_floor_id = sf_ptr->lower_floor_id;
+       }
+
+
+       /* Search old stairs leading to the destination */
+       if (dest_floor_id)
+       {
+               POSITION x, y;
+
+               for (y = 0; y < current_floor_ptr->height; y++)
+               {
+                       for (x = 0; x < current_floor_ptr->width; x++)
+                       {
+                               grid_type *g_ptr = &current_floor_ptr->grid_array[y][x];
+
+                               if (!g_ptr->special) continue;
+                               if (feat_uses_special(g_ptr->feat)) continue;
+                               if (g_ptr->special != dest_floor_id) continue;
+
+                               /* Remove old stairs */
+                               g_ptr->special = 0;
+                               cave_set_feat(y, x, feat_ground_type[randint0(100)]);
+                       }
+               }
+       }
+
+       /* No old destination -- Get new one now */
+       else
+       {
+               dest_floor_id = get_new_floor_id();
+
+               /* Fix it */
+               if (up)
+                       sf_ptr->upper_floor_id = dest_floor_id;
+               else
+                       sf_ptr->lower_floor_id = dest_floor_id;
+       }
+
+       /* Extract destination floor data */
+       dest_sf_ptr = get_sf_ptr(dest_floor_id);
+
+
+       /* Create a staircase */
+       if (up)
+       {
+               cave_set_feat(p_ptr->y, p_ptr->x,
+                       (dest_sf_ptr->last_visit && (dest_sf_ptr->dun_level <= current_floor_ptr->dun_level - 2)) ?
+                       feat_state(feat_up_stair, FF_SHAFT) : feat_up_stair);
+       }
+       else
+       {
+               cave_set_feat(p_ptr->y, p_ptr->x,
+                       (dest_sf_ptr->last_visit && (dest_sf_ptr->dun_level >= current_floor_ptr->dun_level + 2)) ?
+                       feat_state(feat_down_stair, FF_SHAFT) : feat_down_stair);
+       }
+
+
+       /* Connect this stairs to the destination */
+       current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].special = dest_floor_id;
+}
+
+/*
+ * Hack -- map the current panel (plus some) ala "magic mapping"
+ */
+void map_area(POSITION range)
+{
+       int i;
+       POSITION x, y;
+       grid_type *g_ptr;
+       FEAT_IDX feat;
+       feature_type *f_ptr;
+
+       if (d_info[p_ptr->dungeon_idx].flags1 & DF1_DARKNESS) range /= 3;
+
+       /* Scan that area */
+       for (y = 1; y < current_floor_ptr->height - 1; y++)
+       {
+               for (x = 1; x < current_floor_ptr->width - 1; x++)
+               {
+                       if (distance(p_ptr->y, p_ptr->x, y, x) > range) continue;
+
+                       g_ptr = &current_floor_ptr->grid_array[y][x];
+
+                       /* Memorize terrain of the grid */
+                       g_ptr->info |= (CAVE_KNOWN);
+
+                       /* Feature code (applying "mimic" field) */
+                       feat = get_feat_mimic(g_ptr);
+                       f_ptr = &f_info[feat];
+
+                       /* All non-walls are "checked" */
+                       if (!have_flag(f_ptr->flags, FF_WALL))
+                       {
+                               /* Memorize normal features */
+                               if (have_flag(f_ptr->flags, FF_REMEMBER))
+                               {
+                                       /* Memorize the object */
+                                       g_ptr->info |= (CAVE_MARK);
+                               }
+
+                               /* Memorize known walls */
+                               for (i = 0; i < 8; i++)
+                               {
+                                       g_ptr = &current_floor_ptr->grid_array[y + ddy_ddd[i]][x + ddx_ddd[i]];
+
+                                       /* Feature code (applying "mimic" field) */
+                                       feat = get_feat_mimic(g_ptr);
+                                       f_ptr = &f_info[feat];
+
+                                       /* Memorize walls (etc) */
+                                       if (have_flag(f_ptr->flags, FF_REMEMBER))
+                                       {
+                                               /* Memorize the walls */
+                                               g_ptr->info |= (CAVE_MARK);
+                                       }
+                               }
+                       }
+               }
+       }
+
+       p_ptr->redraw |= (PR_MAP);
+       p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
+}