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; }
/* * Create magical stairs after finishing a quest monster. */ static void build_quest_stairs(int y, int x) { int ny, nx; /* Stagger around */ while (!cave_clean_bold(y, x)) { /* Pick a location */ scatter(&ny, &nx, y, x, 5, 1); /* Stagger */ y = ny; x = nx; } /* Destroy any objects */ delete_object(y, x); /* Explain the staircase */ msg_print("A magical staircase appears..."); /* Create stairs down */ cave_set_feat(y, x, FEAT_MORE); light_spot(y, x); /* Update the visuals */ p_ptr->update |= (PU_UPDATE_VIEW | PU_MONSTERS); }
static bool _place_web(int y, int x) { if (!in_bounds(y, x)) return FALSE; if (!cave_clean_bold(y,x) || cave[y][x].m_idx) return FALSE; cave_set_feat(y, x, feat_web); return TRUE; }
/* * Attempt to place an object (normal or good/great) at the given location. * * This routine plays nasty games to generate the "special artifacts". * * This routine uses "object_level" for the "generation level". * * This routine requires a clean floor grid destination. */ void place_object(s32b y, s32b x, bool good, bool great, s32b where) { object_type *q_ptr; /* Paranoia -- check bounds */ if (!in_bounds(y, x)) return; /* Require clean floor space */ if (!cave_clean_bold(y, x)) return; /* Get local object */ q_ptr = make_object(good, great, NULL); /* Make an object (if possible) */ if (q_ptr == NULL) return; if (where == OBJ_FOUND_VAULT) { q_ptr->found = OBJ_FOUND_VAULT; q_ptr->found_aux1 = dungeon_type; q_ptr->found_aux2 = level_or_feat(dungeon_type, dun_level); } else if (where == OBJ_FOUND_FLOOR) { q_ptr->found = OBJ_FOUND_FLOOR; q_ptr->found_aux1 = dungeon_type; q_ptr->found_aux2 = level_or_feat(dungeon_type, dun_level); } else if (where == OBJ_FOUND_SPECIAL) { q_ptr->found = OBJ_FOUND_SPECIAL; } else if (where == OBJ_FOUND_RUBBLE) { q_ptr->found = OBJ_FOUND_RUBBLE; } /* Object array overflow */ if (!floor_carry(y, x, q_ptr)) { /* Hack -- Preserve artifacts */ if (q_ptr->artifact_id) { a_info[q_ptr->artifact_id].cur_num = 0; } else if (has_flag(&k_info[q_ptr->k_idx], FLAG_NORM_ART)) { k_info[q_ptr->k_idx].artifact = 0; } delete_object(q_ptr); } }
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; }
/** * Place an up/down staircase at given location */ void place_random_stairs(int y, int x) { /* Paranoia */ if (!cave_clean_bold(y, x)) return; /* Choose a staircase */ if (!p_ptr->depth) { place_down_stairs(y, x); } else if (OPT(adult_dungeon) && !stage_map[p_ptr->stage][DOWN]) { place_up_stairs(y, x); } else if (randint0(100) < 50) { place_down_stairs(y, x); } else { place_up_stairs(y, x); } }
/* * Places a treasure (Gold or Gems) at given location * * The location must be a legal, clean, floor grid. */ void place_gold(s32b y, s32b x) { object_type *q_ptr; /* Paranoia -- check bounds */ if (!in_bounds(y, x)) return; /* Require clean floor space */ if (!cave_clean_bold(y, x)) return; /* Get local object */ q_ptr = new_object(); /* Make some gold */ if (!make_gold(q_ptr)) return; if (!floor_carry(y, x, q_ptr)) delete_object(q_ptr); }
/* * 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); }