bool place_mirror(void) { /* XXX XXX XXX */ if (!cave_clean_bold(py, px)) { #ifdef JP msg_print("床上のアイテムが呪文を跳ね返した。"); #else msg_print("The object resists the spell."); #endif return FALSE; } /* Create a mirror */ cave[py][px].info |= CAVE_OBJECT; cave[py][px].mimic = feat_mirror; /* Turn on the light */ cave[py][px].info |= CAVE_GLOW; /* Notice */ note_spot(py, px); /* Redraw */ lite_spot(py, px); update_local_illumination(py, px); return TRUE; }
/* Remove a mirror */ void remove_mirror(int y, int x) { cave_type *c_ptr = &cave[y][x]; /* Remove the mirror */ c_ptr->info &= ~(CAVE_OBJECT); c_ptr->mimic = 0; if (d_info[dungeon_type].flags1 & DF1_DARKNESS) { c_ptr->info &= ~(CAVE_GLOW); if (!view_torch_grids) c_ptr->info &= ~(CAVE_MARK); /* Update the monster */ if (c_ptr->m_idx) update_mon(c_ptr->m_idx, FALSE); update_local_illumination(y, x); } /* Notice */ note_spot(y, x); /* Redraw */ lite_spot(y, x); }
/*! * @brief 指定された地点の地形IDを変更する / * Create desired feature * @return なし */ static void do_cmd_wiz_create_feature(void) { static int prev_feat = 0; static int prev_mimic = 0; cave_type *c_ptr; feature_type *f_ptr; char tmp_val[160]; int tmp_feat, tmp_mimic; int y, x; if (!tgt_pt(&x, &y)) return; c_ptr = &cave[y][x]; /* Default */ sprintf(tmp_val, "%d", prev_feat); /* Query */ if (!get_string(_("地形: ", "Feature: "), tmp_val, 3)) return; /* Extract */ tmp_feat = atoi(tmp_val); if (tmp_feat < 0) tmp_feat = 0; else if (tmp_feat >= max_f_idx) tmp_feat = max_f_idx - 1; /* Default */ sprintf(tmp_val, "%d", prev_mimic); /* Query */ if (!get_string(_("地形 (mimic): ", "Feature (mimic): "), tmp_val, 3)) return; /* Extract */ tmp_mimic = atoi(tmp_val); if (tmp_mimic < 0) tmp_mimic = 0; else if (tmp_mimic >= max_f_idx) tmp_mimic = max_f_idx - 1; cave_set_feat(y, x, tmp_feat); c_ptr->mimic = tmp_mimic; f_ptr = &f_info[get_feat_mimic(c_ptr)]; if (have_flag(f_ptr->flags, FF_GLYPH) || have_flag(f_ptr->flags, FF_MINOR_GLYPH)) c_ptr->info |= (CAVE_OBJECT); else if (have_flag(f_ptr->flags, FF_MIRROR)) c_ptr->info |= (CAVE_GLOW | CAVE_OBJECT); /* Notice */ note_spot(y, x); /* Redraw */ lite_spot(y, x); /* Update some things */ p_ptr->update |= (PU_FLOW); prev_feat = tmp_feat; prev_mimic = tmp_mimic; }
static bool _mirror_place(void) { if (!cave_clean_bold(py, px)) { msg_print("The object resists the spell."); return FALSE; } cave[py][px].info |= CAVE_OBJECT; cave[py][px].mimic = feat_mirror; cave[py][px].info |= CAVE_GLOW; note_spot(py, px); lite_spot(py, px); update_local_illumination(py, px); return TRUE; }
/* * Let an object fall to the ground at or near a location. * * The initial location is assumed to be "in_bounds()". * * This function takes a parameter "chance". This is the percentage * chance that the item will "disappear" instead of drop. If the object * has been thrown, then this is the chance of disappearance on contact. * * Hack -- this function uses "chance" to determine if it should produce * some form of "description" of the drop event (under the player). * * We check several locations to see if we can find a location at which * the object can combine, stack, or be placed. Artifacts will try very * hard to be placed, including "teleporting" to a useful grid if needed. */ s16b drop_near(object_type *j_ptr, s32b chance, s32b y, s32b x) { s32b i, k, d, s; s32b bs, bn; s32b by, bx; s32b dy, dx; s32b ty, tx; s16b o_idx = 0; cave_type *c_ptr; char o_name[80]; bool flag = FALSE; bool plural = FALSE; /* Extract plural */ if (j_ptr->number != 1) plural = TRUE; /* Describe object */ object_desc(o_name, j_ptr, FALSE, 0); /* Handle normal "breakage" */ if (!(j_ptr->art_name || artifact_p(j_ptr)) && (rand_int(100) < chance)) { /* Message */ msg_format("The %s disappear%s.", o_name, (plural ? "" : "s")); /* Debug */ if (wizard) msg_print("(breakage)"); delete_object(j_ptr); /* Failure */ return (0); } /* Score */ bs = -1; /* Picker */ bn = 0; /* Default */ by = y; bx = x; /* Scan local grids */ for (dy = -3; dy <= 3; dy++) { /* Scan local grids */ for (dx = -3; dx <= 3; dx++) { bool comb = FALSE; /* Calculate actual distance */ d = (dy * dy) + (dx * dx); /* Ignore distant grids */ if (d > 10) continue; /* Location */ ty = y + dy; tx = x + dx; /* Skip illegal grids */ if (!in_bounds(ty, tx)) continue; /* Require line of sight */ if (!los(y, x, ty, tx)) continue; /* Obtain grid */ c_ptr = &cave[ty][tx]; /* Require floor space (or shallow terrain) -KMW- */ if (!has_flag(&f_info[c_ptr->feat], FLAG_FLOOR)) continue; /* No traps */ if (flag_used(&c_ptr->activations)) continue; /* No objects */ k = 0; /* Scan objects in that grid */ for_inventory_slot(&c_ptr->inventory, o_ptr); { /* Check for possible combination */ if (object_similar(o_ptr, j_ptr)) comb = TRUE; /* Count objects */ k++; } end_inventory_slot(); /* Add new object */ if (!comb) k++; /* Paranoia */ if (k >= inventory_limit_inven(&c_ptr->inventory)) continue; /* Calculate score */ s = 1000 - (d + k * 5); /* Skip bad values */ if (s < bs) continue; /* New best value */ if (s > bs) bn = 0; /* Apply the randomizer to equivalent values */ if ((++bn >= 2) && (rand_int(bn) != 0)) continue; /* Keep score */ bs = s; /* Track it */ by = ty; bx = tx; /* Okay */ flag = TRUE; } } /* Handle lack of space */ if (!flag && !(artifact_p(j_ptr) || j_ptr->art_name)) { /* Message */ msg_format("The %s disappear%s.", o_name, (plural ? "" : "s")); /* Debug */ if (wizard) msg_print("(no floor space)"); delete_object(j_ptr); /* Failure */ return (0); } /* Find a grid */ for (i = 0; !flag; i++) { /* Bounce around */ if (i < 1000) { ty = rand_spread(by, 1); tx = rand_spread(bx, 1); } /* Random locations */ else { ty = rand_int(cur_hgt); tx = rand_int(cur_wid); } /* Grid */ c_ptr = &cave[ty][tx]; /* Require floor space */ if (!has_flag(&f_info[c_ptr->feat], FLAG_FLOOR) || has_flag(&f_info[c_ptr->feat], FLAG_NO_WALK)) continue; /* Bounce to that location */ by = ty; bx = tx; /* Require floor space */ if (!cave_clean_bold(by, bx)) continue; /* Okay */ flag = TRUE; } j_ptr->iy = by; j_ptr->ix = bx; j_ptr->held_m_idx = 0; /* Grid */ c_ptr = &cave[by][bx]; /* Carry */ o_idx = inven_carry_inven(&c_ptr->inventory, j_ptr, FALSE); /* * j_ptr might have been merged into an existing object and then * deleted, so re-get the object. */ j_ptr = get_object(item_slot_to_item(o_idx)); /* Note the spot */ note_spot(by, bx); /* Draw the spot */ lite_spot(by, bx); /* Mega-Hack -- no message if "dropped" by player */ /* Message when an object falls under the player */ if (chance && (by == p_ptr->py) && (bx == p_ptr->px)) { msg_print("You feel something roll beneath your feet."); /* Sound */ sound(SOUND_DROP); } process_hooks(HOOK_DROPPED_NEAR, "(O,b,d,d,d,d)", j_ptr, chance, y, x, by, bx); /* XXX XXX XXX */ /* Result */ return (o_idx); }