more follow-up for mk_artifact()

This commit is contained in:
nhmall
2025-01-26 21:38:37 -05:00
parent ee0d955050
commit f75e4a13b7

View File

@@ -150,12 +150,12 @@ artiname(int artinum)
*/ */
struct obj * struct obj *
mk_artifact( mk_artifact(
struct obj *otmp, /* existing object; ignored if alignment specified */ struct obj *otmp, /* existing object; ignored and disposed of
* if alignment specified */
aligntyp alignment, /* target alignment, or A_NONE */ aligntyp alignment, /* target alignment, or A_NONE */
uchar max_giftvalue, /* cap on generated giftvalue */ uchar max_giftvalue, /* cap on generated giftvalue */
boolean adjust_spe) /* whether to add spe to situational artifacts */ boolean adjust_spe) /* whether to add spe to situational artifacts */
{ {
struct obj *artiobj;
const struct artifact *a; const struct artifact *a;
int m, n, altn; int m, n, altn;
boolean by_align = (alignment != A_NONE); boolean by_align = (alignment != A_NONE);
@@ -239,9 +239,31 @@ mk_artifact(
m = eligible[rn2(n)]; /* [0..n-1] */ m = eligible[rn2(n)]; /* [0..n-1] */
a = &artilist[m]; a = &artilist[m];
/* make an appropriate object, then christen it */ /* make an appropriate object if necessary, then christen it */
artiobj = mksobj((int) a->otyp, TRUE, FALSE); if (by_align) {
/* 'by_align' indicates that an alignment was passed as
* an argument, but also that the 'otmp' argument is not
* relevant */
struct obj *artiobj = mksobj((int) a->otyp, TRUE, FALSE);
if (artiobj) {
/* nonnull value of 'otmp' is unexpected. Cope. */
if (otmp) /* just in case; avoid orphaning */
dispose_of_orig_obj(otmp);
otmp = artiobj;
}
}
/*
* otmp should be nonnull at this point:
* either the passed argument (if !by_align == A_NONE), or
* the result of mksobj() just above if by_align is an alignment. */
assert(otmp != 0);
/* prevent erosion from generating */
otmp->oeroded = otmp->oeroded2 = 0;
otmp = oname(otmp, a->name, ONAME_NO_FLAGS);
otmp->oartifact = m; /* probably already set by this point, but */
/* set existence and reason for creation bits */
artifact_origin(otmp, ONAME_RANDOM); /* 'random' is default */
if (adjust_spe) { if (adjust_spe) {
int new_spe; int new_spe;
@@ -249,26 +271,19 @@ mk_artifact(
non-weapons, which always have a gen_spe of 0, and for many non-weapons, which always have a gen_spe of 0, and for many
weapons, too.) The result is clamped into the "normal" range to weapons, too.) The result is clamped into the "normal" range to
prevent an outside chance of +12 artifacts generating. */ prevent an outside chance of +12 artifacts generating. */
new_spe = (int)artiobj->spe + a->gen_spe; new_spe = (int)otmp->spe + a->gen_spe;
if (new_spe >= -10 && new_spe < 10) if (new_spe >= -10 && new_spe < 10)
artiobj->spe = new_spe; otmp->spe = new_spe;
} }
/* prevent erosion from generating */
artiobj->oeroded = artiobj->oeroded2 = 0;
artiobj = oname(artiobj, a->name, ONAME_NO_FLAGS);
artiobj->oartifact = m;
/* set existence and reason for creation bits */
artifact_origin(artiobj, ONAME_RANDOM); /* 'random' is default */
if (otmp)
dispose_of_orig_obj(otmp);
otmp = artiobj;
} else { } else {
/* nothing appropriate could be found; return original object */ /* nothing appropriate could be found; return original object */
if (by_align && otmp) { if (by_align && otmp) {
/* (there shouldn't have been an original object) */ /* (there shouldn't have been an original object). Deal with it.
* The callers that passed an alignment and a NULL otmp are
* prepared to get a potential NULL return value, so this is okay */
dispose_of_orig_obj(otmp); dispose_of_orig_obj(otmp);
otmp = 0; otmp = 0;
} } /* otherwise, otmp has not changed; just fallthrough to return it */
} }
return otmp; return otmp;
} }