add some new, easier achievements

Introduce eight achievements that can be attained by more players.
 Entered Gnomish Mines  - self explanatory
 Entered Mine Town      - the town portion, not just the level
 Entered a shop         - any tended shop on any level
 Entered a temple       - likewise for temple
 Consulted the Oracle   - bought at least one major or minor oracle
 Read a Discworld Novel - read at least one passage
 Entered Sokoban        - like mines
 Entered the Big Room   - not always possible since not always present

The novel and bigroom ones aren't always achieveable since novels are
only guaranteed if a book or scroll shop gets created and bigroom is
only guaranteed in wizard mode.  No one ever claimed that every
possible achievement can be attained in a single game.  (If one for
entering the Fort Ludios level--or perhaps entering the Fort itself--
eventually gets add, that won't be possible in every game either.)

The mine town one probably needs some tweaking.  Two of the town's
seven variants have no town boundary (despite a rectangular area of
pre-defined map) and at present simply arriving on either of those
levels is enough to be credited with the entered-town achievement.

Bump EDITLEVEL because u.uachieved[] has increased in size.  This
time it has been expanded to the maximum that xlogfile's bitmask of
achievements can handle, enough for up to 9 more achievements without
another EDITLEVEL increment.
This commit is contained in:
PatR
2020-02-12 14:35:37 -08:00
parent 1ec6e6f96b
commit 804499d9be
15 changed files with 195 additions and 88 deletions

View File

@@ -2198,7 +2198,7 @@ boolean pick;
check_special_room(FALSE);
if (IS_SINK(levl[u.ux][u.uy].typ) && Levitation)
dosinkfall();
if (!g.in_steed_dismounting) { /* if dismounting, we'll check again later */
if (!g.in_steed_dismounting) { /* if dismounting, check again later */
boolean pit;
/* if levitation is due to time out at the end of this
@@ -2462,7 +2462,7 @@ register boolean newlev;
/* possibly deliver a one-time room entry message */
void
check_special_room(newlev)
register boolean newlev;
boolean newlev;
{
register struct monst *mtmp;
char *ptr;
@@ -2475,6 +2475,12 @@ register boolean newlev;
if (!*u.uentered && !*u.ushops_entered) /* implied by newlev */
return; /* no entrance messages necessary */
if (!g.context.achieveo.minetn_reached
&& In_mines(&u.uz) && in_town(u.ux, u.uy)) {
record_achievement(ACH_TOWN);
g.context.achieveo.minetn_reached = TRUE;
}
/* Did we just enter a shop? */
if (*u.ushops_entered)
u_entered_shop(u.ushops_entered);
@@ -2504,6 +2510,7 @@ register boolean newlev;
case MORGUE:
if (midnight()) {
const char *run = locomotion(g.youmonst.data, "Run");
pline("%s away! %s away!", run, run);
} else
You("have an uncanny feeling...");
@@ -2528,6 +2535,7 @@ register boolean newlev;
break;
case DELPHI: {
struct monst *oracle = monstinroom(&mons[PM_ORACLE], roomno);
if (oracle) {
if (!oracle->mpeaceful)
verbalize("You're in Delphi, %s.", g.plname);
@@ -2586,7 +2594,6 @@ register boolean newlev;
}
}
}
return;
}