Split out ini_inv filtered mkobj
This commit is contained in:
102
src/u_init.c
102
src/u_init.c
@@ -13,6 +13,7 @@ struct trobj {
|
|||||||
Bitfield(trbless, 2);
|
Bitfield(trbless, 2);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct obj *ini_inv_mkobj_filter(int, boolean);
|
||||||
static void ini_inv(struct trobj *) NONNULLARG1;
|
static void ini_inv(struct trobj *) NONNULLARG1;
|
||||||
static void knows_object(int);
|
static void knows_object(int);
|
||||||
static void knows_class(char);
|
static void knows_class(char);
|
||||||
@@ -1021,6 +1022,61 @@ restricted_spell_discipline(int otyp)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* create random object of certain class, filtering out too powerful items */
|
||||||
|
static struct obj *
|
||||||
|
ini_inv_mkobj_filter(int oclass, boolean got_sp1)
|
||||||
|
{
|
||||||
|
struct obj *obj;
|
||||||
|
int otyp, trycnt = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For random objects, do not create certain overly powerful
|
||||||
|
* items: wand of wishing, ring of levitation, or the
|
||||||
|
* polymorph/polymorph control combination. Specific objects,
|
||||||
|
* i.e. the discovery wishing, are still OK.
|
||||||
|
* Also, don't get a couple of really useless items. (Note:
|
||||||
|
* punishment isn't "useless". Some players who start out with
|
||||||
|
* one will immediately read it and use the iron ball as a
|
||||||
|
* weapon.)
|
||||||
|
*/
|
||||||
|
obj = mkobj(oclass, FALSE);
|
||||||
|
otyp = obj->otyp;
|
||||||
|
|
||||||
|
while (otyp == WAN_WISHING || otyp == gn.nocreate
|
||||||
|
|| otyp == gn.nocreate2 || otyp == gn.nocreate3
|
||||||
|
|| otyp == gn.nocreate4 || otyp == RIN_LEVITATION
|
||||||
|
/* 'useless' items */
|
||||||
|
|| otyp == POT_HALLUCINATION
|
||||||
|
|| otyp == POT_ACID
|
||||||
|
|| otyp == SCR_AMNESIA
|
||||||
|
|| otyp == SCR_FIRE
|
||||||
|
|| otyp == SCR_BLANK_PAPER
|
||||||
|
|| otyp == SPE_BLANK_PAPER
|
||||||
|
|| otyp == RIN_AGGRAVATE_MONSTER
|
||||||
|
|| otyp == RIN_HUNGER
|
||||||
|
|| otyp == WAN_NOTHING
|
||||||
|
/* orcs start with poison resistance */
|
||||||
|
|| (otyp == RIN_POISON_RESISTANCE && Race_if(PM_ORC))
|
||||||
|
/* Monks don't use weapons */
|
||||||
|
|| (otyp == SCR_ENCHANT_WEAPON && Role_if(PM_MONK))
|
||||||
|
/* wizard patch -- they already have one */
|
||||||
|
|| (otyp == SPE_FORCE_BOLT && Role_if(PM_WIZARD))
|
||||||
|
/* powerful spells are either useless to
|
||||||
|
low level players or unbalancing; also
|
||||||
|
spells in restricted skill categories */
|
||||||
|
|| (obj->oclass == SPBOOK_CLASS
|
||||||
|
&& (objects[otyp].oc_level > (got_sp1 ? 3 : 1)
|
||||||
|
|| restricted_spell_discipline(otyp)))
|
||||||
|
|| otyp == SPE_NOVEL) {
|
||||||
|
dealloc_obj(obj);
|
||||||
|
obj = mkobj(oclass, FALSE);
|
||||||
|
otyp = obj->otyp;
|
||||||
|
if (++trycnt > 1000)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ini_inv(struct trobj *trop)
|
ini_inv(struct trobj *trop)
|
||||||
{
|
{
|
||||||
@@ -1033,52 +1089,8 @@ ini_inv(struct trobj *trop)
|
|||||||
if (otyp != UNDEF_TYP) {
|
if (otyp != UNDEF_TYP) {
|
||||||
obj = mksobj(otyp, TRUE, FALSE);
|
obj = mksobj(otyp, TRUE, FALSE);
|
||||||
} else { /* UNDEF_TYP */
|
} else { /* UNDEF_TYP */
|
||||||
int trycnt = 0;
|
obj = ini_inv_mkobj_filter(trop->trclass, got_sp1);
|
||||||
/*
|
|
||||||
* For random objects, do not create certain overly powerful
|
|
||||||
* items: wand of wishing, ring of levitation, or the
|
|
||||||
* polymorph/polymorph control combination. Specific objects,
|
|
||||||
* i.e. the discovery wishing, are still OK.
|
|
||||||
* Also, don't get a couple of really useless items. (Note:
|
|
||||||
* punishment isn't "useless". Some players who start out with
|
|
||||||
* one will immediately read it and use the iron ball as a
|
|
||||||
* weapon.)
|
|
||||||
*/
|
|
||||||
obj = mkobj(trop->trclass, FALSE);
|
|
||||||
otyp = obj->otyp;
|
otyp = obj->otyp;
|
||||||
while (otyp == WAN_WISHING || otyp == gn.nocreate
|
|
||||||
|| otyp == gn.nocreate2 || otyp == gn.nocreate3
|
|
||||||
|| otyp == gn.nocreate4 || otyp == RIN_LEVITATION
|
|
||||||
/* 'useless' items */
|
|
||||||
|| otyp == POT_HALLUCINATION
|
|
||||||
|| otyp == POT_ACID
|
|
||||||
|| otyp == SCR_AMNESIA
|
|
||||||
|| otyp == SCR_FIRE
|
|
||||||
|| otyp == SCR_BLANK_PAPER
|
|
||||||
|| otyp == SPE_BLANK_PAPER
|
|
||||||
|| otyp == RIN_AGGRAVATE_MONSTER
|
|
||||||
|| otyp == RIN_HUNGER
|
|
||||||
|| otyp == WAN_NOTHING
|
|
||||||
/* orcs start with poison resistance */
|
|
||||||
|| (otyp == RIN_POISON_RESISTANCE && Race_if(PM_ORC))
|
|
||||||
/* Monks don't use weapons */
|
|
||||||
|| (otyp == SCR_ENCHANT_WEAPON && Role_if(PM_MONK))
|
|
||||||
/* wizard patch -- they already have one */
|
|
||||||
|| (otyp == SPE_FORCE_BOLT && Role_if(PM_WIZARD))
|
|
||||||
/* powerful spells are either useless to
|
|
||||||
low level players or unbalancing; also
|
|
||||||
spells in restricted skill categories */
|
|
||||||
|| (obj->oclass == SPBOOK_CLASS
|
|
||||||
&& (objects[otyp].oc_level > (got_sp1 ? 3 : 1)
|
|
||||||
|| restricted_spell_discipline(otyp)))
|
|
||||||
|| otyp == SPE_NOVEL) {
|
|
||||||
dealloc_obj(obj);
|
|
||||||
obj = mkobj(trop->trclass, FALSE);
|
|
||||||
otyp = obj->otyp;
|
|
||||||
if (++trycnt > 1000)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Heavily relies on the fact that 1) we create wands
|
/* Heavily relies on the fact that 1) we create wands
|
||||||
* before rings, 2) that we create rings before
|
* before rings, 2) that we create rings before
|
||||||
* spellbooks, and that 3) not more than 1 object of a
|
* spellbooks, and that 3) not more than 1 object of a
|
||||||
|
|||||||
Reference in New Issue
Block a user