Restructure u_init to allow for inventory rerolling
This doesn't implement inventory rerolling, just adds the infrastructure: it's now possible to call u_init_inventory_attrs multiple times and the starting inventory/attributes replace those from the previous call rather than compounding.
This commit is contained in:
@@ -3304,7 +3304,9 @@ extern void trap_sanity_check(void);
|
|||||||
|
|
||||||
/* ### u_init.c ### */
|
/* ### u_init.c ### */
|
||||||
|
|
||||||
extern void u_init(void);
|
extern void u_init_misc(void);
|
||||||
|
extern void u_init_inventory_attrs(void);
|
||||||
|
extern void u_init_skills_discoveries(void);
|
||||||
|
|
||||||
/* ### uhitm.c ### */
|
/* ### uhitm.c ### */
|
||||||
|
|
||||||
|
|||||||
@@ -786,7 +786,7 @@ newgame(void)
|
|||||||
* in hero's initial inventory */
|
* in hero's initial inventory */
|
||||||
init_artifacts(); /* before u_init() in case $WIZKIT specifies
|
init_artifacts(); /* before u_init() in case $WIZKIT specifies
|
||||||
* any artifacts */
|
* any artifacts */
|
||||||
u_init();
|
u_init_misc();
|
||||||
|
|
||||||
l_nhcore_init(); /* create a Lua state that lasts until end of game */
|
l_nhcore_init(); /* create a Lua state that lasts until end of game */
|
||||||
reset_glyphmap(gm_newgame);
|
reset_glyphmap(gm_newgame);
|
||||||
@@ -801,14 +801,15 @@ newgame(void)
|
|||||||
|
|
||||||
mklev();
|
mklev();
|
||||||
u_on_upstairs();
|
u_on_upstairs();
|
||||||
if (wizard)
|
|
||||||
obj_delivery(FALSE); /* finish wizkit */
|
|
||||||
vision_reset(); /* set up internals for level (after mklev) */
|
vision_reset(); /* set up internals for level (after mklev) */
|
||||||
check_special_room(FALSE);
|
check_special_room(FALSE);
|
||||||
|
|
||||||
if (MON_AT(u.ux, u.uy))
|
if (MON_AT(u.ux, u.uy))
|
||||||
mnexto(m_at(u.ux, u.uy), RLOC_NOMSG);
|
mnexto(m_at(u.ux, u.uy), RLOC_NOMSG);
|
||||||
(void) makedog();
|
(void) makedog();
|
||||||
|
|
||||||
|
u_init_inventory_attrs();
|
||||||
|
u_init_skills_discoveries();
|
||||||
docrt();
|
docrt();
|
||||||
|
|
||||||
if (flags.legacy) {
|
if (flags.legacy) {
|
||||||
|
|||||||
128
src/u_init.c
128
src/u_init.c
@@ -27,6 +27,7 @@ staticfn void knows_class(char);
|
|||||||
staticfn void u_init_role(void);
|
staticfn void u_init_role(void);
|
||||||
staticfn void u_init_race(void);
|
staticfn void u_init_race(void);
|
||||||
staticfn void pauper_reinit(void);
|
staticfn void pauper_reinit(void);
|
||||||
|
staticfn const struct def_skill *skills_for_role(void);
|
||||||
staticfn void u_init_carry_attr_boost(void);
|
staticfn void u_init_carry_attr_boost(void);
|
||||||
staticfn boolean restricted_spell_discipline(int);
|
staticfn boolean restricted_spell_discipline(int);
|
||||||
|
|
||||||
@@ -625,7 +626,11 @@ knows_class(char sym)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* role-specific initializations */
|
/* role-specific initializations, mostly inventory
|
||||||
|
|
||||||
|
other things may be initialised here, but the function might run more than
|
||||||
|
once, so any non-inventory initialisations should be nonrandom and
|
||||||
|
idempotent (i.e. doing them twice is OK) */
|
||||||
staticfn void
|
staticfn void
|
||||||
u_init_role(void)
|
u_init_role(void)
|
||||||
{
|
{
|
||||||
@@ -654,7 +659,6 @@ u_init_role(void)
|
|||||||
knows_object(TOUCHSTONE, FALSE); /* FALSE: don't override pauper here,
|
knows_object(TOUCHSTONE, FALSE); /* FALSE: don't override pauper here,
|
||||||
* but TOUCHSTONE will be made known
|
* but TOUCHSTONE will be made known
|
||||||
* in pauper_reinit() */
|
* in pauper_reinit() */
|
||||||
skill_init(Skill_A);
|
|
||||||
break;
|
break;
|
||||||
case PM_BARBARIAN:
|
case PM_BARBARIAN:
|
||||||
if (rn2(100) >= 50) { /* see above comment */
|
if (rn2(100) >= 50) { /* see above comment */
|
||||||
@@ -666,11 +670,9 @@ u_init_role(void)
|
|||||||
ini_inv(Lamp);
|
ini_inv(Lamp);
|
||||||
knows_class(WEAPON_CLASS); /* excluding polearms */
|
knows_class(WEAPON_CLASS); /* excluding polearms */
|
||||||
knows_class(ARMOR_CLASS);
|
knows_class(ARMOR_CLASS);
|
||||||
skill_init(Skill_B);
|
|
||||||
break;
|
break;
|
||||||
case PM_CAVE_DWELLER:
|
case PM_CAVE_DWELLER:
|
||||||
ini_inv(Cave_man);
|
ini_inv(Cave_man);
|
||||||
skill_init(Skill_C);
|
|
||||||
break;
|
break;
|
||||||
case PM_HEALER:
|
case PM_HEALER:
|
||||||
u.umoney0 = rn1(1000, 1001);
|
u.umoney0 = rn1(1000, 1001);
|
||||||
@@ -678,7 +680,6 @@ u_init_role(void)
|
|||||||
if (!rn2(25))
|
if (!rn2(25))
|
||||||
ini_inv(Lamp);
|
ini_inv(Lamp);
|
||||||
knows_object(POT_FULL_HEALING, FALSE);
|
knows_object(POT_FULL_HEALING, FALSE);
|
||||||
skill_init(Skill_H);
|
|
||||||
break;
|
break;
|
||||||
case PM_KNIGHT:
|
case PM_KNIGHT:
|
||||||
ini_inv(Knight);
|
ini_inv(Knight);
|
||||||
@@ -686,7 +687,6 @@ u_init_role(void)
|
|||||||
knows_class(ARMOR_CLASS);
|
knows_class(ARMOR_CLASS);
|
||||||
/* give knights chess-like mobility--idea from wooledge@..cwru.edu */
|
/* give knights chess-like mobility--idea from wooledge@..cwru.edu */
|
||||||
HJumping |= FROMOUTSIDE;
|
HJumping |= FROMOUTSIDE;
|
||||||
skill_init(Skill_K);
|
|
||||||
break;
|
break;
|
||||||
case PM_MONK: {
|
case PM_MONK: {
|
||||||
static const struct trobj *M_spell[] = {
|
static const struct trobj *M_spell[] = {
|
||||||
@@ -702,7 +702,6 @@ u_init_role(void)
|
|||||||
knows_class(ARMOR_CLASS);
|
knows_class(ARMOR_CLASS);
|
||||||
/* sufficiently martial-arts oriented item to ignore language issue */
|
/* sufficiently martial-arts oriented item to ignore language issue */
|
||||||
knows_object(SHURIKEN, FALSE);
|
knows_object(SHURIKEN, FALSE);
|
||||||
skill_init(Skill_Mon);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PM_CLERIC: /* priest/priestess */
|
case PM_CLERIC: /* priest/priestess */
|
||||||
@@ -712,7 +711,6 @@ u_init_role(void)
|
|||||||
else if (!rn2(10))
|
else if (!rn2(10))
|
||||||
ini_inv(Lamp);
|
ini_inv(Lamp);
|
||||||
knows_object(POT_WATER, TRUE); /* override pauper */
|
knows_object(POT_WATER, TRUE); /* override pauper */
|
||||||
skill_init(Skill_P);
|
|
||||||
/* KMH, conduct --
|
/* KMH, conduct --
|
||||||
* Some may claim that this isn't agnostic, since they
|
* Some may claim that this isn't agnostic, since they
|
||||||
* are literally "priests" and they have holy water.
|
* are literally "priests" and they have holy water.
|
||||||
@@ -724,7 +722,6 @@ u_init_role(void)
|
|||||||
case PM_RANGER:
|
case PM_RANGER:
|
||||||
ini_inv(Ranger);
|
ini_inv(Ranger);
|
||||||
knows_class(WEAPON_CLASS); /* bows, arrows, spears only */
|
knows_class(WEAPON_CLASS); /* bows, arrows, spears only */
|
||||||
skill_init(Skill_Ran);
|
|
||||||
break;
|
break;
|
||||||
case PM_ROGUE:
|
case PM_ROGUE:
|
||||||
u.umoney0 = 0;
|
u.umoney0 = 0;
|
||||||
@@ -735,7 +732,6 @@ u_init_role(void)
|
|||||||
* but sack will be made known in
|
* but sack will be made known in
|
||||||
* pauper_reinit() */
|
* pauper_reinit() */
|
||||||
knows_class(WEAPON_CLASS); /* daggers only */
|
knows_class(WEAPON_CLASS); /* daggers only */
|
||||||
skill_init(Skill_R);
|
|
||||||
break;
|
break;
|
||||||
case PM_SAMURAI:
|
case PM_SAMURAI:
|
||||||
ini_inv(Samurai);
|
ini_inv(Samurai);
|
||||||
@@ -753,7 +749,6 @@ u_init_role(void)
|
|||||||
samarai an advantage of knowing several items in advance */
|
samarai an advantage of knowing several items in advance */
|
||||||
knows_object(i, FALSE);
|
knows_object(i, FALSE);
|
||||||
}
|
}
|
||||||
skill_init(Skill_S);
|
|
||||||
break;
|
break;
|
||||||
case PM_TOURIST:
|
case PM_TOURIST:
|
||||||
u.umoney0 = rnd(1000);
|
u.umoney0 = rnd(1000);
|
||||||
@@ -766,7 +761,6 @@ u_init_role(void)
|
|||||||
ini_inv(Towel);
|
ini_inv(Towel);
|
||||||
else if (!rn2(20))
|
else if (!rn2(20))
|
||||||
ini_inv(Magicmarker);
|
ini_inv(Magicmarker);
|
||||||
skill_init(Skill_T);
|
|
||||||
break;
|
break;
|
||||||
case PM_VALKYRIE:
|
case PM_VALKYRIE:
|
||||||
ini_inv(Valkyrie);
|
ini_inv(Valkyrie);
|
||||||
@@ -774,21 +768,24 @@ u_init_role(void)
|
|||||||
ini_inv(Lamp);
|
ini_inv(Lamp);
|
||||||
knows_class(WEAPON_CLASS); /* excludes polearms */
|
knows_class(WEAPON_CLASS); /* excludes polearms */
|
||||||
knows_class(ARMOR_CLASS);
|
knows_class(ARMOR_CLASS);
|
||||||
skill_init(Skill_V);
|
|
||||||
break;
|
break;
|
||||||
case PM_WIZARD:
|
case PM_WIZARD:
|
||||||
ini_inv(Wizard);
|
ini_inv(Wizard);
|
||||||
if (!rn2(5))
|
if (!rn2(5))
|
||||||
ini_inv(Blindfold);
|
ini_inv(Blindfold);
|
||||||
skill_init(Skill_W);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: /* impossible */
|
default: /* impossible */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gn.nocreate = STRANGE_OBJECT;
|
||||||
|
gn.nocreate2 = STRANGE_OBJECT;
|
||||||
|
gn.nocreate3 = STRANGE_OBJECT;
|
||||||
|
gn.nocreate4 = STRANGE_OBJECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* race-specific initializations */
|
/* race-specific initializations, same restrictions as u_init_role */
|
||||||
staticfn void
|
staticfn void
|
||||||
u_init_race(void)
|
u_init_race(void)
|
||||||
{
|
{
|
||||||
@@ -940,8 +937,9 @@ u_init_carry_attr_boost(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* initialise u, except inventory, attributes, skills and discoveries */
|
||||||
void
|
void
|
||||||
u_init(void)
|
u_init_misc(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct u_roleplay tmpuroleplay = u.uroleplay; /* set by rcfile options */
|
struct u_roleplay tmpuroleplay = u.uroleplay; /* set by rcfile options */
|
||||||
@@ -1027,44 +1025,19 @@ u_init(void)
|
|||||||
if (u.uroleplay.blind)
|
if (u.uroleplay.blind)
|
||||||
HBlinded |= FROMOUTSIDE; /* set PermaBlind */
|
HBlinded |= FROMOUTSIDE; /* set PermaBlind */
|
||||||
|
|
||||||
u_init_role();
|
|
||||||
u_init_race();
|
|
||||||
if (u.uroleplay.pauper)
|
|
||||||
pauper_reinit();
|
|
||||||
|
|
||||||
/* roughly based on distribution in human population */
|
/* roughly based on distribution in human population */
|
||||||
u.uhandedness = rn2(10) ? RIGHT_HANDED : LEFT_HANDED;
|
u.uhandedness = rn2(10) ? RIGHT_HANDED : LEFT_HANDED;
|
||||||
|
|
||||||
if (discover)
|
|
||||||
ini_inv(Wishing);
|
|
||||||
|
|
||||||
if (wizard)
|
|
||||||
read_wizkit();
|
|
||||||
|
|
||||||
if (u.umoney0)
|
|
||||||
ini_inv(Money);
|
|
||||||
u.umoney0 += hidden_gold(TRUE); /* in case sack has gold in it */
|
|
||||||
|
|
||||||
find_ac(); /* get initial ac value */
|
|
||||||
init_attr(75); /* init attribute values */
|
|
||||||
vary_init_attr(); /* minor variation to attrs */
|
|
||||||
u_init_carry_attr_boost();
|
|
||||||
max_rank_sz(); /* set max str size for class ranks */
|
max_rank_sz(); /* set max str size for class ranks */
|
||||||
|
|
||||||
/* If we have at least one spell, force starting Pw to be enough,
|
|
||||||
so hero can cast the level 1 spell they should have */
|
|
||||||
if (num_spells() && (u.uenmax < SPELL_LEV_PW(1)))
|
|
||||||
u.uen = u.uenmax = u.uenpeak = u.ueninc[u.ulevel] = SPELL_LEV_PW(1);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* skills aren't initialized, so we use the role-specific skill lists */
|
/* the appropriate set of skills for the role */
|
||||||
staticfn boolean
|
staticfn const struct def_skill *
|
||||||
restricted_spell_discipline(int otyp)
|
skills_for_role(void)
|
||||||
{
|
{
|
||||||
const struct def_skill *skills;
|
const struct def_skill *skills;
|
||||||
int this_skill = spell_skilltype(otyp);
|
|
||||||
|
|
||||||
switch (Role_switch) {
|
switch (Role_switch) {
|
||||||
case PM_ARCHEOLOGIST:
|
case PM_ARCHEOLOGIST:
|
||||||
@@ -1107,10 +1080,20 @@ restricted_spell_discipline(int otyp)
|
|||||||
skills = Skill_W;
|
skills = Skill_W;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
skills = 0; /* lint suppression */
|
panic("No skills found for role");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return skills;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* skills aren't initialized, so we use the role-specific skill lists */
|
||||||
|
staticfn boolean
|
||||||
|
restricted_spell_discipline(int otyp)
|
||||||
|
{
|
||||||
|
const struct def_skill *skills = skills_for_role();
|
||||||
|
int this_skill = spell_skilltype(otyp);
|
||||||
|
|
||||||
while (skills && skills->skill != P_NONE) {
|
while (skills && skills->skill != P_NONE) {
|
||||||
if (skills->skill == this_skill)
|
if (skills->skill == this_skill)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -1369,8 +1352,6 @@ ini_inv(const struct trobj *trop)
|
|||||||
quan = 1;
|
quan = 1;
|
||||||
obj = addinv(obj);
|
obj = addinv(obj);
|
||||||
|
|
||||||
ini_inv_use_obj(obj);
|
|
||||||
|
|
||||||
/* First spellbook should be level 1 - did we get it? */
|
/* First spellbook should be level 1 - did we get it? */
|
||||||
if (obj->oclass == SPBOOK_CLASS && objects[obj->otyp].oc_level == 1)
|
if (obj->oclass == SPBOOK_CLASS && objects[obj->otyp].oc_level == 1)
|
||||||
got_sp1 = TRUE;
|
got_sp1 = TRUE;
|
||||||
@@ -1382,6 +1363,59 @@ ini_inv(const struct trobj *trop)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* initialise starting inventory and attributes
|
||||||
|
|
||||||
|
this function can be run multiple times and will overwrite the effects of
|
||||||
|
previous runs */
|
||||||
|
staticfn void
|
||||||
|
u_init_inventory_attrs(void)
|
||||||
|
{
|
||||||
|
gl.lastinvnr = 51;
|
||||||
|
while (gi.invent)
|
||||||
|
useupall(gi.invent);
|
||||||
|
|
||||||
|
u.umoney0 = 0;
|
||||||
|
u_init_role();
|
||||||
|
u_init_race();
|
||||||
|
|
||||||
|
if (discover)
|
||||||
|
ini_inv(Wishing);
|
||||||
|
|
||||||
|
if (wizard) {
|
||||||
|
read_wizkit();
|
||||||
|
obj_delivery(FALSE); /* finish wizkit */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (u.umoney0)
|
||||||
|
ini_inv(Money);
|
||||||
|
u.umoney0 += hidden_gold(TRUE); /* in case sack has gold in it */
|
||||||
|
|
||||||
|
init_attr(75); /* init attribute values */
|
||||||
|
vary_init_attr(); /* minor variation to attrs */
|
||||||
|
u_init_carry_attr_boost();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* side effects of starting inventory (e.g. discovering it) and skills (both
|
||||||
|
those based on role and those based on starting inventory) */
|
||||||
|
void
|
||||||
|
u_init_skills_discoveries(void)
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
for (otmp = gi.invent; otmp; otmp = otmp->nobj)
|
||||||
|
ini_inv_use_obj(otmp);
|
||||||
|
|
||||||
|
skill_init(skills_for_role());
|
||||||
|
if (u.uroleplay.pauper)
|
||||||
|
pauper_reinit();
|
||||||
|
|
||||||
|
/* If we have at least one spell, force starting Pw to be enough,
|
||||||
|
so hero can cast the level 1 spell they should have */
|
||||||
|
if (num_spells() && (u.uenmax < SPELL_LEV_PW(1)))
|
||||||
|
u.uen = u.uenmax = u.uenpeak = u.ueninc[u.ulevel] = SPELL_LEV_PW(1);
|
||||||
|
|
||||||
|
find_ac(); /* get initial ac value */
|
||||||
|
}
|
||||||
|
|
||||||
#undef UNDEF_TYP
|
#undef UNDEF_TYP
|
||||||
#undef UNDEF_SPE
|
#undef UNDEF_SPE
|
||||||
#undef UNDEF_BLESS
|
#undef UNDEF_BLESS
|
||||||
|
|||||||
Reference in New Issue
Block a user