Exemple #1
0
/**
 * 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];
}
Exemple #2
0
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;
}