/** * Prepare an object based on an object kind. */ void object_prep(object_type * o_ptr, int k_idx, aspect rand_aspect) { int i; object_kind *k_ptr = &k_info[k_idx]; /* Clear the record */ (void) WIPE(o_ptr, object_type); /* Save the kind */ o_ptr->k_idx = k_idx; o_ptr->kind = k_ptr; /* Efficiency -- tval/sval */ o_ptr->tval = k_ptr->tval; o_ptr->sval = k_ptr->sval; /* Default "pval" */ o_ptr->pval = randcalc(k_ptr->pval, k_ptr->level, rand_aspect); /* Default number */ o_ptr->number = 1; /* Default weight */ o_ptr->weight = k_ptr->weight; /* Default magic */ o_ptr->to_h = randcalc(k_ptr->to_h, k_ptr->level, rand_aspect); o_ptr->to_d = randcalc(k_ptr->to_d, k_ptr->level, rand_aspect); o_ptr->to_a = randcalc(k_ptr->to_a, k_ptr->level, rand_aspect); /* Default power */ o_ptr->ac = k_ptr->ac; o_ptr->dd = k_ptr->dd; o_ptr->ds = k_ptr->ds; /* Default effect and time */ o_ptr->effect = k_ptr->effect; o_ptr->time = k_ptr->time; /* Default flags */ of_copy(o_ptr->flags_obj, k_ptr->flags_obj); cf_copy(o_ptr->flags_curse, k_ptr->flags_curse); /* Default resists, bonuses, multiples */ for (i = 0; i < MAX_P_RES; i++) o_ptr->percent_res[i] = k_ptr->percent_res[i]; for (i = 0; i < A_MAX; i++) o_ptr->bonus_stat[i] = k_ptr->bonus_stat[i]; for (i = 0; i < MAX_P_BONUS; i++) o_ptr->bonus_other[i] = k_ptr->bonus_other[i]; for (i = 0; i < MAX_P_SLAY; i++) o_ptr->multiple_slay[i] = k_ptr->multiple_slay[i]; for (i = 0; i < MAX_P_BRAND; i++) o_ptr->multiple_brand[i] = k_ptr->multiple_brand[i]; }
bool wiz_create_item_subaction(menu_type * m, const ui_event * e, int oid) { int *choices = menu_priv(m); object_type *i_ptr; object_type object_type_body; /* Artifacts */ if (choose_artifact) { int i; int o_idx; artifact_type *a_ptr = &a_info[choices[oid]]; /* Get the artifact info */ //a_ptr = &a_info[choices[oid]]; /* Ignore "empty" artifacts */ if (!a_ptr->name) return TRUE; /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Acquire the "kind" index */ o_idx = lookup_kind(a_ptr->tval, a_ptr->sval); /* Create the base object */ object_prep(i_ptr, o_idx, RANDOMISE); /* Mark the object as an artifact. */ i_ptr->name1 = choices[oid]; /* Extract the fields */ i_ptr->pval = a_ptr->pval; i_ptr->ac = a_ptr->ac; i_ptr->dd = a_ptr->dd; i_ptr->ds = a_ptr->ds; i_ptr->to_a = a_ptr->to_a; i_ptr->to_h = a_ptr->to_h; i_ptr->to_d = a_ptr->to_d; i_ptr->weight = a_ptr->weight; of_copy(i_ptr->flags_obj, a_ptr->flags_obj); cf_copy(i_ptr->flags_curse, a_ptr->flags_curse); for (i = 0; i < MAX_P_RES; i++) i_ptr->percent_res[i] = a_ptr->percent_res[i]; for (i = 0; i < A_MAX; i++) i_ptr->bonus_stat[i] = a_ptr->bonus_stat[i]; for (i = 0; i < MAX_P_BONUS; i++) i_ptr->bonus_other[i] = a_ptr->bonus_other[i]; for (i = 0; i < MAX_P_SLAY; i++) i_ptr->multiple_slay[i] = a_ptr->multiple_slay[i]; for (i = 0; i < MAX_P_BRAND; i++) i_ptr->multiple_brand[i] = a_ptr->multiple_brand[i]; /* Transfer the activation information. */ if (a_ptr->effect) i_ptr->effect = a_ptr->effect; } /* Regular objects */ else { object_kind *kind = &k_info[choices[oid]]; if (e->type != EVT_SELECT) return TRUE; /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Create the item */ object_prep(i_ptr, kind->kidx, RANDOMISE); /* Apply magic (no messages, no artifacts) */ apply_magic(i_ptr, p_ptr->danger, FALSE, FALSE, FALSE); /* Hack -- Since treasure objects are not effected by apply_magic, they * need special processing. */ if (i_ptr->tval == TV_GOLD) { i_ptr->pval = kind->cost / 2 + randint1((kind->cost + 1) / 2); } /* Mark as cheat, and where created */ i_ptr->origin = ORIGIN_CHEAT; i_ptr->origin_z = chunk_list[p_ptr->stage].z_pos; i_ptr->origin_y = chunk_list[p_ptr->stage].y_pos; i_ptr->origin_x = chunk_list[p_ptr->stage].x_pos; } /* Drop from heaven */ drop_near(i_ptr, -1, p_ptr->py, p_ptr->px, TRUE); /* All done */ msg("Allocated."); return FALSE; }