So I'm playing a game with birth-no-artifacts as is my wont, and just now I killed Eol, and he dropped ... nothing. Zip. Nada. Since he is hardwired to drop at least a couple of good objects, I wondered how this was possible. Looking at the code, I see at least one problem: in obj-make.c, routine make_object we see:
...
/* Try to make a special artifact */
if (one_in_(good ? 10 : 1000))
return make_artifact_special(j_ptr, lev);
...
and of course the first executable line of make_artifact_special is:
...
if (OPT(adult_no_artifacts)) return (FALSE);
...
All of which means that if the RNG smiles upon me and would have tried to create a special artifact in a normal game, in a no-artifacts game I get squat.
The simple remedy is to test before calling make_artifact_special (well, actually I guess the simple remedy is to do nothing, but aside from that):
...
if (one_in_(good ? 10 : 1000) && (!(OPT(adult_no_artifacts)))) {
return make_artifact_special(j_ptr, lev);
}
...
Personally, I think that if no-artifacts is set, then as a consolation prize one should have a chance at a great object, maybe something like:
...
if (one_in_(good ? 10 : 1000)) {
if (OPT(adult_no_artifacts)) {
if (one_in_(10)) good = great = TRUE;
}
else {
return make_artifact_special(j_ptr, lev);
}
}
...
But then again, it seems that this whole thing is a bit unfair even in a normal artifacts game, since even there if make_artifact_special fails, you get nothing. So I guess what I really think this should be is:
...
if (one_in_(good ? 10 : 1000)) {
if (make_artifact_special(j_ptr, lev)) return TRUE;
/* else possible consolation prize */
if (one_in_(10)) good = great = TRUE;
}
...
i.e. only return early if in fact you make a special artifact, otherwise go ahead and make the (normal/good/great) object that you tried to turn into a special artifact.
...
/* Try to make a special artifact */
if (one_in_(good ? 10 : 1000))
return make_artifact_special(j_ptr, lev);
...
and of course the first executable line of make_artifact_special is:
...
if (OPT(adult_no_artifacts)) return (FALSE);
...
All of which means that if the RNG smiles upon me and would have tried to create a special artifact in a normal game, in a no-artifacts game I get squat.
The simple remedy is to test before calling make_artifact_special (well, actually I guess the simple remedy is to do nothing, but aside from that):
...
if (one_in_(good ? 10 : 1000) && (!(OPT(adult_no_artifacts)))) {
return make_artifact_special(j_ptr, lev);
}
...
Personally, I think that if no-artifacts is set, then as a consolation prize one should have a chance at a great object, maybe something like:
...
if (one_in_(good ? 10 : 1000)) {
if (OPT(adult_no_artifacts)) {
if (one_in_(10)) good = great = TRUE;
}
else {
return make_artifact_special(j_ptr, lev);
}
}
...
But then again, it seems that this whole thing is a bit unfair even in a normal artifacts game, since even there if make_artifact_special fails, you get nothing. So I guess what I really think this should be is:
...
if (one_in_(good ? 10 : 1000)) {
if (make_artifact_special(j_ptr, lev)) return TRUE;
/* else possible consolation prize */
if (one_in_(10)) good = great = TRUE;
}
...
i.e. only return early if in fact you make a special artifact, otherwise go ahead and make the (normal/good/great) object that you tried to turn into a special artifact.
Comment