rare books store tribute

This commit is contained in:
nhmall
2015-03-18 21:47:18 -04:00
parent debdf7ca48
commit d01bec9fae
11 changed files with 143 additions and 9 deletions

View File

@@ -73,6 +73,16 @@ struct warntype_info {
short speciesidx; /* index of above in mons[] (for save/restore) */
};
struct tribute_info {
size_t tributesz; /* make it possible to skip this in future */
char *name; /* what is this tribute for */
boolean enabled; /* Do we have tributes turned on? */
Bitfield(book,1); /* Have we completed the book tribute? */
/* Markers for other tributes can go here */
/* 31 free bits */
int bookidx;
};
struct context_info {
unsigned ident; /* social security number for each monster */
unsigned no_of_wizards; /* 0, 1 or 2 (wizard and his shadow) */
@@ -103,6 +113,7 @@ struct context_info {
struct book_info spbook;
struct takeoff_info takeoff;
struct warntype_info warntype;
struct tribute_info tribute;
};
extern NEARDATA struct context_info context;

View File

@@ -394,6 +394,7 @@ E const char *NDECL(roguename);
E struct obj *FDECL(realloc_obj,
(struct obj *, int, genericptr_t, int, const char *));
E char *FDECL(coyotename, (struct monst *,char *));
E const char *FDECL(noveltitle, (int *));
/* ### do_wear.c ### */

View File

@@ -487,6 +487,9 @@ newgame()
context.stethoscope_move = -1L;
context.warnlevel = 1;
context.next_attrib_check = 600L; /* arbitrary first setting */
context.tribute.enabled = TRUE; /* turn on 3.6 tributes */
context.tribute.tributesz = sizeof(struct tribute_info);
context.tribute.bookidx = 0;
for (i = 0; i < NUMMONS; i++)
mvitals[i].mvflags = mons[i].geno & G_NOCORPSE;

View File

@@ -1123,4 +1123,35 @@ char *buf;
return buf;
}
static const char * const sir_Terry_novels[] = {
"The Colour of Magic", "The Light Fantastic", "Equal Rites",
"Mort", "Sourcery", "Wyrd Sisters", "Pyramids", "Guards! Guards!",
"Eric", "Moving Pictures", "Reaper Man", "Witches Abroad",
"Small Gods", "Lords and Ladies", "Men at Arms", "Soul Music",
"Interesting Times", "Maskerade", "Feet of Clay", "Hogfather",
"Jingo", "The Last Continent", "Carpe Jugulum", "The Fifth Elephant",
"The Truth", "Thief of Time", "The Last Hero",
"The Amazing Maurice and his Educated Rodents", "Night Watch",
"The Wee Free Men", "Monstrous Regiment", "A Hat Full of Sky",
"Going Postal", "Thud!", "Wintersmith", "Making Money",
"Unseen Academicals", "I Shall Wear Midnight", "Snuff",
"Raising Steam", "The Shepherd's Crown"
};
const char *
noveltitle(novidx)
int *novidx;
{
int j, k = SIZE(sir_Terry_novels)-1;
j = rn2(k);
if (novidx) {
if (*novidx == -1) *novidx = j;
else if ((*novidx >= 0) && (*novidx <= k)) j = *novidx;
}
return sir_Terry_novels[j];
}
/*do_name.c*/

View File

@@ -861,6 +861,8 @@ boolean artif;
/* case TIN: */
set_corpsenm(otmp, otmp->corpsenm);
break;
case SPE_NOVEL:
break;
}
/* unique objects may have an associated artifact entry */

View File

@@ -1604,8 +1604,6 @@ register struct monst *mtmp;
}
if(mtmp->iswiz) wizdead();
if(mtmp->data->msound == MS_NEMESIS) nemdead();
if(mtmp->data == &mons[PM_MEDUSA])
u.uachieve.killed_medusa = 1;
if(glyph_is_invisible(levl[mtmp->mx][mtmp->my].glyph))
unmap_object(mtmp->mx, mtmp->my);
m_detach(mtmp, mptr);

View File

@@ -821,6 +821,9 @@ SPELL("freeze sphere", "hardcover", P_MATTER_SPELL, 20, 2, 1, 1, NODIR, CLR
#endif
/* blank spellbook must come last because it retains its description */
SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER),
/* tribute book for 3.6 */
OBJECT(OBJ("novel", "printed"), BITS(0,0,1,0,0,0,0,1,0,0,0,P_NONE,HI_PAPER), 0,
SPBOOK_CLASS, 0, 0, 0, 1, 0, 0, 0, 1, 20, CLR_BRIGHT_BLUE),
/* a special, one of a kind, spellbook */
OBJECT(OBJ("Book of the Dead", "papyrus"), BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,PAPER), 0,
SPBOOK_CLASS, 0, 0,20, 10000, 0, 0, 0, 7, 20, HI_PAPER),

View File

@@ -448,6 +448,18 @@ register struct obj *obj;
Sprintf(buf, "%s wand", dn);
break;
case SPBOOK_CLASS:
if (typ == SPE_NOVEL) { /* 3.6 tribute */
if (!dknown) {
Strcpy(buf, "book");
} else if (nn) {
Strcpy(buf, actualn);
} else if (un) {
Sprintf(buf, "novel called %s", un);
} else
Sprintf(buf, "%s book", dn);
break;
} else
/* end of tribute */
if (!dknown) {
Strcpy(buf, "spellbook");
} else if (nn) {

View File

@@ -10,7 +10,7 @@
STATIC_DCL boolean FDECL(veggy_item, (struct obj *obj,int));
STATIC_DCL int NDECL(shkveg);
STATIC_DCL void FDECL(mkveggy_at, (int,int));
STATIC_DCL void FDECL(mkshobj_at, (const struct shclass *,int,int));
STATIC_DCL void FDECL(mkshobj_at, (const struct shclass *,int,int,BOOLEAN_P));
STATIC_DCL void FDECL(nameshk, (struct monst *,const char * const *));
STATIC_DCL int FDECL(shkinit, (const struct shclass *,struct mkroom *));
@@ -357,15 +357,26 @@ int sx, sy;
}
STATIC_OVL void
mkshobj_at(shp, sx, sy)
mkshobj_at(shp, sx, sy, mkspecl)
/* make an object of the appropriate type for a shop square */
const struct shclass *shp;
int sx, sy;
boolean mkspecl;
{
struct monst *mtmp;
int atype;
struct permonst *ptr;
/* 3.6 tribute */
if (mkspecl && !strcmp(shp->name, "rare books")) {
int novidx = -1; /* -1 triggers random noveltitle() */
struct obj *novel=mksobj_at(SPE_NOVEL, sx, sy, FALSE, FALSE);
if (novel) novel = oname(novel, noveltitle(&novidx));
context.tribute.bookidx = novidx;
context.tribute.book = 1;
return;
}
if (rn2(100) < depth(&u.uz) &&
!MON_AT(sx, sy) && (ptr = mkclass(S_MIMIC,0)) &&
(mtmp = makemon(ptr,sx,sy,NO_MM_FLAGS)) != 0) {
@@ -572,7 +583,8 @@ register struct mkroom *sroom;
* shop-style placement (all squares except a row nearest the first
* door get objects).
*/
register int sx, sy, sh;
int sx, sy, sh;
int stockcount = 0, specialspot = 0;
char buf[BUFSZ];
int rmno = (int)((sroom - rooms) + ROOMOFFSET);
const struct shclass *shp = &shtypes[shp_indx];
@@ -608,6 +620,29 @@ register struct mkroom *sroom;
make_engr_at(m, n, buf, 0L, DUST);
}
if (context.tribute.enabled && !context.tribute.book) {
/*
* Out of the number of spots where we're actually
* going to put stuff, randomly single out one in particular.
*/
for (sx = sroom->lx; sx <= sroom->hx; sx++)
for (sy = sroom->ly; sy <= sroom->hy; sy++) {
if (sroom->irregular) {
if (levl[sx][sy].edge || (int)levl[sx][sy].roomno != rmno ||
distmin(sx, sy, doors[sh].x, doors[sh].y) <= 1)
continue;
}
else if ((sx == sroom->lx && doors[sh].x == sx - 1) ||
(sx == sroom->hx && doors[sh].x == sx + 1) ||
(sy == sroom->ly && doors[sh].y == sy - 1) ||
(sy == sroom->hy && doors[sh].y == sy + 1)) continue;
stockcount++;
}
specialspot = rnd(stockcount);
stockcount = 0;
}
for(sx = sroom->lx; sx <= sroom->hx; sx++)
for(sy = sroom->ly; sy <= sroom->hy; sy++) {
if(sroom->irregular) {
@@ -618,7 +653,8 @@ register struct mkroom *sroom;
(sx == sroom->hx && doors[sh].x == sx+1) ||
(sy == sroom->ly && doors[sh].y == sy-1) ||
(sy == sroom->hy && doors[sh].y == sy+1)) continue;
mkshobj_at(shp, sx, sy);
stockcount++;
mkshobj_at(shp, sx, sy, ((stockcount) && (stockcount == specialspot)));
}
/*

View File

@@ -411,8 +411,9 @@ int
study_book(spellbook)
register struct obj *spellbook;
{
register int booktype = spellbook->otyp;
register boolean confused = (Confusion != 0);
int booktype = spellbook->otyp;
boolean confused = (Confusion != 0);
const char *whatchadoin = "memorize the spell";
boolean too_hard = FALSE;
/* attempting to read dull book may make hero fall asleep */
@@ -440,7 +441,8 @@ register struct obj *spellbook;
/* handle the sequence: start reading, get interrupted,
have context.spbook.book become erased somehow, resume reading it */
booktype != SPE_BLANK_PAPER) {
You("continue your efforts to memorize the spell.");
You("continue your efforts to %s.", (booktype == SPE_NOVEL) ?
"read the novel" : "memorize the spell");
} else {
/* KMH -- Simplified this code */
if (booktype == SPE_BLANK_PAPER) {
@@ -448,6 +450,22 @@ register struct obj *spellbook;
makeknown(booktype);
return(1);
}
/* 3.6 tribute */
if (booktype == SPE_NOVEL) {
/* Obtain current Terry Pratchett book
title for the current game. */
const char *tribtitle = noveltitle(&context.tribute.bookidx);
/*
* Place code here to pull desireable
* random passages from somewhere (data.base?)
* using tribtitle as the key?
*/
pline("Reading \"%s.\"", tribtitle); /* debug confirmation */
return(1);
}
switch (objects[booktype].oc_level) {
case 1:
case 2:

View File

@@ -6930,6 +6930,25 @@ P = (108, 145, 182)
MMMMMMMJJJAAMMMM
MMMMMMMMMMMMMMMM
}
# tile 363 (printed / novel)
{
MMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMM
MMMMEEEEMMMMMMMM
MMMMEEEEEEMMMMMM
MMMEEEEEEEEEEMMM
MMMEEEEEEEEEBMMM
MMEEEEEEEEEEOAMM
MMEEEEEEEEEBOAAM
MEEEEEEEEEEOEAMM
MEEEEEEEEEBOAAMM
MEOOEEEEEEOEAMMM
MMEEOOOEEBOAAMMM
MMMMEEEOOOEAMMMM
MMMMMMMEEEAAMMMM
MMMMMMMMMMMMMMMM
}
# tile 364 (papyrus / Book of the Dead)
{
MMMMMMMMMMMMMMMM