clean master after moving of newer content to feature branch

This commit is contained in:
nhmall
2018-12-10 22:16:08 -05:00
parent 00efee7948
commit ca84486133
28 changed files with 257 additions and 927 deletions

View File

@@ -302,11 +302,6 @@ boolean resuming;
/* vision while buried done here */
else if (u.uburied)
under_ground(0);
#ifdef CONWAY
if (level.flags.conway){
conway_update();
}
#endif
/* when immobile, count is in turns */
if (multi < 0) {

View File

@@ -20,7 +20,7 @@ STATIC_OVL boolean
no_bones_level(lev)
d_level *lev;
{
extern d_level save_dlevel; /* in do.c XXX */
extern d_level save_dlevel; /* in do.c */
s_level *sptr;
if (ledger_no(&save_dlevel))
@@ -32,9 +32,6 @@ d_level *lev;
in any dungeon (level 1 isn't multiway) */
|| Is_botlevel(lev)
|| (Is_branchlev(lev) && lev->dlevel > 1)
#ifdef CONWAY
|| level.flags.conway
#endif
/* no bones in the invocation level */
|| (In_hell(lev)
&& lev->dlevel == dunlevs_in_dungeon(lev) - 1));

View File

@@ -337,11 +337,6 @@ struct plinemsg_type *plinemsg_types = (struct plinemsg_type *) 0;
const char *ARGV0;
#endif
/* XXX see comment in save.c */
#ifdef CONWAY
void NDECL((*dropleveltempsfn)) = 0;
#endif
/* support for lint.h */
unsigned nhUse_dummy = 0;

View File

@@ -1170,9 +1170,6 @@ boolean at_stairs, falling, portal;
struct monst *mtmp;
char whynot[BUFSZ];
char *annotation;
#ifdef CONWAY
char need_late_reload_call = 0;
#endif
if (dunlev(newlevel) > dunlevs_in_dungeon(newlevel))
newlevel->dlevel = dunlevs_in_dungeon(newlevel);
@@ -1246,10 +1243,6 @@ boolean at_stairs, falling, portal;
fd = currentlevel_rewrite();
if (fd < 0)
return;
#ifdef DROPLEVEL
/* We're now committed to the level change. */
if(dropleveltempsfn) (*dropleveltempsfn)();
#endif
/* discard context which applies to the level we're leaving;
for lock-picking, container may be carried, in which case we
@@ -1357,10 +1350,6 @@ boolean at_stairs, falling, portal;
getlev(fd, hackpid, new_ledger, FALSE);
(void) nhclose(fd);
oinit(); /* reassign level dependent obj probabilities */
#ifdef CONWAY
/* XXX move into DROPLEVEL framework? */
need_late_reload_call = 1;
#endif
}
reglyph_darkroom();
/* do this prior to level-change pline messages */
@@ -1581,10 +1570,6 @@ boolean at_stairs, falling, portal;
} else {
if (new && Is_rogue_level(&u.uz))
You("enter what seems to be an older, more primitive world.");
#ifdef CONWAY
if (level.flags.conway)
You("feel the rules of Life are different here.");
#endif
/* main dungeon message from your quest leader */
if (!In_quest(&u.uz0) && at_dgn_entrance("The Quest")
&& !(u.uevent.qcompleted || u.uevent.qexpelled
@@ -1602,15 +1587,6 @@ boolean at_stairs, falling, portal;
#ifdef INSURANCE
save_currentstate();
#endif
#ifdef CONWAY
if (need_late_reload_call){
/* This MUST be after save_currenstate() to prevent freeing
* the state table we just allocated. */
if(level.flags.conway){
conway_restore();
}
}
#endif
if ((annotation = get_annotation(&u.uz)) != 0)
You("remember this level as %s.", annotation);

View File

@@ -1767,7 +1767,6 @@ struct monst *mtmp, *victim;
/* monster died after killing enemy but before calling this function */
/* currently possible if killing a gas spore */
/* Also used to abort processing for CONWAYS's mildew temp monsters. */
if (DEADMONSTER(mtmp))
return (struct permonst *) 0;

View File

@@ -24,6 +24,8 @@ STATIC_DCL int FDECL(gulpmm, (struct monst *, struct monst *,
struct attack *));
STATIC_DCL int FDECL(explmm, (struct monst *, struct monst *,
struct attack *));
STATIC_DCL int FDECL(mdamagem, (struct monst *, struct monst *,
struct attack *));
STATIC_DCL void FDECL(mswingsm, (struct monst *, struct monst *,
struct obj *));
STATIC_DCL void FDECL(noises, (struct monst *, struct attack *));

View File

@@ -625,9 +625,6 @@ clear_level_structures()
level.flags.arboreal = 0;
level.flags.wizard_bones = 0;
level.flags.corrmaze = 0;
#ifdef CONWAY
level.flags.conway = 0;
#endif
nroom = 0;
rooms[0].hx = -1;

View File

@@ -7,11 +7,6 @@
#include "sp_lev.h"
#include "lev.h" /* save & restore info */
#define CONWAY_DEBUG
#ifdef CONWAY_DEBUG
static int conway_moved = 2;
#endif
/* from sp_lev.c, for fixup_special() */
extern lev_region *lregions;
extern int num_lregions;
@@ -35,10 +30,6 @@ STATIC_DCL void FDECL(migr_booty_item, (int, const char *));
STATIC_DCL void FDECL(migrate_orc, (struct monst *, unsigned long));
STATIC_DCL void NDECL(stolen_booty);
#ifdef CONWAY
STATIC_DCL void NDECL(conway_setup);
#endif
/* adjust a coordinate one step in the specified direction */
#define mz_move(X, Y, dir) \
do { \
@@ -626,11 +617,6 @@ fixup_special()
} else if (u.uz.dnum == mines_dnum && ransacked) {
stolen_booty();
}
#ifdef CONWAY
if (level.flags.conway) {
conway_setup();
}
#endif
if (lregions)
free((genericptr_t) lregions), lregions = 0;
@@ -1946,429 +1932,4 @@ boolean ini;
}
}
#ifdef CONWAY
/* Hero has just stumbled into Conway's game of Life - which in NH is a
* rather dangerous place. I hope. */
/* Temp storage for the next generation. The normal game state is always used
* for the current generation since it changes outside of life's control. */
static char (*ls)[COLNO][ROWNO]; /* life state */
static int (*lslev)[COLNO][ROWNO]; /* total level of surrounding life */
/* Conway's Life was binary: alive or dead. Here it's a little more complex. */
static int
conway_islive(lvlp, x, y)
int *lvlp;
int x,y;
{
struct monst *mhere;
/* Hero's levels don't count here since it's likely to be
* much larger than the surrounding life. */
if (u.ux == x && u.uy == y)
{
return !(Upolyd && nonliving(youmonst.data));
}
mhere = m_at(x,y);
if (!mhere || nonliving(mhere->data))
return 0;
if (lvlp)
*lvlp += mhere->m_lev;
return 1;
}
static struct lifelimits {
int xmin,xmax;
int ymin,ymax;
} lls;
/* Find the bounds of the rectangular area where we will play life. */
static void
conway_findactive() {
lls.xmin = 0;
lls.ymin = 0;
lls.xmax = COLNO-1;
lls.ymax = ROWNO-1;
/* XXX is this test correct? */
/* #define CONWAY_WALL(x,y) IS_ROCK(levl[x][y].typ) */
#define CONWAY_WALL(x,y) (levl[x][y].wall_info & W_NONDIGGABLE)
while(CONWAY_WALL(lls.xmin, ROWNO/2) && lls.xmin < COLNO/2)
lls.xmin++;
while(CONWAY_WALL(COLNO/2, lls.ymin) && lls.ymin < ROWNO/2)
lls.ymin++;
while(CONWAY_WALL(lls.xmax, ROWNO/2) && lls.xmax > COLNO/2)
lls.xmax--;
while(CONWAY_WALL(COLNO/2, lls.ymax) && lls.ymax > ROWNO/2)
lls.ymax--;
#undef CONWAY_WALL
if (lls.xmin > COLNO/2 || lls.ymin > ROWNO/2
|| lls.xmax < COLNO/2 || lls.ymax < ROWNO/2)
panic("can't find active area in level");
#ifdef CONWAY_DEBUG
{
char b[100];
sprintf(b, "lls.x(%d-%d) .y(%d-%d)",lls.xmin,lls.xmax,lls.ymin,lls.ymax);
paniclog("trace",b);
}
#endif
}
static void NDECL((*helddroplevel)) = 0;
/* Leaving the level - get rid of our scratchpad. */
static void
conway_cleanup() {
#ifdef CONWAY_DEBUG
paniclog("trace","conway_cleanup()");
if(!conway_moved){
panic("conway cleanup with no moves");
}
#endif
if (ls) {
free(ls);
ls = NULL;
}
if (lslev) {
free(lslev);
lslev = NULL;
}
DROPLEVEL_UNWIND(helddroplevel);
}
/* Entering / reentering the level. */
void
conway_restore() {
#ifdef CONWAY_DEBUG
conway_moved = 0;
paniclog("trace","conway_restore()");
#endif
DROPLEVEL_WINDUP(conway_cleanup);
ls = (char(*)[COLNO][ROWNO])alloc(sizeof(char[COLNO][ROWNO]));
lslev = (int(*)[COLNO][ROWNO])alloc(sizeof(int[COLNO][ROWNO]));
conway_findactive();
}
/* First entry into the level. */
static void
conway_setup() {
int cnt;
int subtype = rn2(3);
char *force = nh_getenv("SPLEVTYPE2");
#ifdef CONWAY_DEBUG
if(conway_moved != 2)
impossible("moved != 2 in conway_setup");
paniclog("trace","conway_setup()");
#endif
conway_restore();
if (force && *force) {
int tmp = atoi(force);
if (tmp>=0 && tmp <=2)
subtype = tmp;
}
switch(subtype) {
case 0: /* just the normal bigroom population */
break;
case 1: /* extra mildews to start */
/* TUNE ME! */
cnt = (lls.xmax-lls.xmin+1) * (lls.ymax-lls.ymin+1) / 32;
while(cnt--) {
/* XXX is flags correct? */
(void) makemon(&mons[PM_MILDEW], 0, 0, MM_NOCOUNTBIRTH);
}
break;
case 2: /* a glider */
/* XXX need to add to this - pick multiple of multiple known
* configurations in multiple orientations - later */
{
int x = 3 + rn2(lls.xmax-lls.xmin - 5); /* prevent wrapping */
int y = 3 + rn2(lls.ymax-lls.ymin - 5);
(void)makemon(&mons[PM_MILDEW], x, y+2, MM_NOCOUNTBIRTH);
(void)makemon(&mons[PM_MILDEW], x+1,y+2, MM_NOCOUNTBIRTH);
(void)makemon(&mons[PM_MILDEW], x+2,y+2, MM_NOCOUNTBIRTH);
(void)makemon(&mons[PM_MILDEW], x+1, y, MM_NOCOUNTBIRTH);
(void)makemon(&mons[PM_MILDEW], x+2,y+1, MM_NOCOUNTBIRTH);
}
break;
}
}
static int
LIMIT(n, lbound, ubound)
int n;
int lbound, ubound;
{
int rv;
if (n<lbound) {
rv = ubound;
} else {
if (n>ubound) {
rv = lbound;
} else {
rv = n;
}
}
return rv;
}
static int
conway_islive_wrap(lvlp, x, y)
int *lvlp;
int x;
int y;
{
return conway_islive(lvlp,
LIMIT(x, lls.xmin, lls.xmax),
LIMIT(y, lls.ymin, lls.ymax));
}
static struct monst *
conway_random_neighbor(x,y)
int x,y;
{
#define LRN(a,b) if (conway_islive_wrap(NULL, a, b)) return m_at(a,b);
int mutation[8];
int ndx;
int last=8;
for(ndx=0;ndx<8;ndx++)mutation[ndx] = ndx;
for(ndx=0;ndx<8;ndx++) {
int entry = rn2(last);
int pick = mutation[entry];
last--;
mutation[entry] = mutation[last];
switch(pick) {
case 0: LRN(x-1, y-1); break;
case 1: LRN(x, y-1); break;
case 2: LRN(x+1, y-1); break;
case 3: LRN(x-1, y ); break;
case 4: LRN(x+1, y ); break;
case 5: LRN(x-1, y+1); break;
case 6: LRN(x, y+1); break;
case 7: LRN(x+1, y+1); break;
default: impossible("no neighbor in a crowd");
}
}
return NULL;
#undef LRN
}
/*
Implement the normal Conway algorithm. Undead are not alive. Anything lower
level than the sum of the life monsters around it is absorbed (ala The Borg/The
Blob) and not just continued into the next generation. This of course includes
the hero.
*/
void
conway_update() {
int x, y;
#ifdef CONWAY_DEBUG
conway_moved = 1;
#endif
if (!lslev)
#ifdef CONWAY_DEBUG
{
impossible("DEBUG: conway update doing emergency recovery");
conway_setup();
}
#else
panic("conway_update: lslev=null");
#endif
/* Be unpredictable: Life updates about half of the time, but not on
alternate moves. */
if (monstermoves % 16 < 5)
return;
if (rn2(11) < 3)
return;
/* first, figure out what changes are needed for the next generation */
for(x=lls.xmin; x<=lls.xmax; x++) {
for(y=lls.ymin; y<=lls.ymax; y++) {
*lslev[x][y] = 0; /* total levels of live neighbors */
#ifdef notyet
/*
This isn't needed unless there are interior wall features or other places
we don't want to put a monster.
if( this is not a legal position for a monster) {
ls[x][y] = 99; /* flag for no action */
continue;
}
*/
#endif
/* count neighbors (and their levels) */
*ls[x][y] =
conway_islive_wrap(&*lslev[x][y], x-1, y-1) +
conway_islive_wrap(&*lslev[x][y], x, y-1) +
conway_islive_wrap(&*lslev[x][y], x+1, y-1) +
conway_islive_wrap(&*lslev[x][y], x-1, y ) +
conway_islive_wrap(&*lslev[x][y], x+1, y ) +
conway_islive_wrap(&*lslev[x][y], x-1, y+1) +
conway_islive_wrap(&*lslev[x][y], x, y+1) +
conway_islive_wrap(&*lslev[x][y], x+1, y+1);
/*pline("R(%d %d)=%d(%d) ",x,y,ls[x][y],lslev[x][y]);*/
}
}
/* now apply the changes to the game state */
/*#define LDEBUG*/
#ifdef LDEBUG
int counts[10]={0,0,0,0,0,0,0,0,0};
/*pline("bounds: (%d,%d)-(%d,%d)", lls.xmin,lls.ymin,lls.xmax,lls.ymax);
(void) makemon(&mons[PM_GRID_BUG], lls.xmin, lls.ymin, MM_NOCOUNTBIRTH);
(void) makemon(&mons[PM_GRID_BUG], lls.xmax, lls.ymax, MM_NOCOUNTBIRTH);*/
#endif
#define DO_DIE_NOTHING 0
#define DO_DIE_LONELY 1
#define DO_DIE_CROWD 2
#define DO_LIVE 3
for(x=lls.xmin; x<=lls.xmax; x++) {
for(y=lls.ymin; y<=lls.ymax; y++) {
struct monst *mhere;
int action = DO_DIE_NOTHING;
#ifdef LDEBUG
counts[ls[x][y]]++;
#endif
switch(*ls[x][y]) {
#ifdef notyet
case 99: /* special case: forced no action */
break;
#endif
/* die of loneliness */
case 0:
case 1:
action = DO_DIE_LONELY;
break;
/* make/continue life */
case 2:
case 3:
action = DO_LIVE;
break;
/* die of overcrowding */
case 4:
case 5:
case 6:
case 7:
case 8:
action = DO_DIE_CROWD;
break;
default:
panic("bad neighbor count");
}
switch(action) {
case DO_DIE_NOTHING:
break;
case DO_DIE_LONELY:
case DO_DIE_CROWD:
if (MON_AT(x,y)) {
struct monst *mp = m_at(x,y);
if (mp->data == &mons[PM_MILDEW]) {
/* mildew: just play life */
monkilled(mp, NULL, AD_ANY);
} else {
/* others get drained first */
struct monst *dummy_m;
struct attack dummy_a = { AT_ANY, AD_DRLI, 0, 0 };
if (action == DO_DIE_CROWD) {
dummy_m = conway_random_neighbor(x,y);
} else {
dummy_m = newmonst();
(void) memset((genericptr_t) dummy_m, 0,
sizeof(*dummy_m));
dummy_m->data = &mons[PM_MILDEW];
}
(void)mdamagem(dummy_m, mp, &dummy_a);
if (action != DO_DIE_CROWD) {
free(dummy_m);
}
}
} else {
if (HERO_AT(x,y)) {
/* hero takes damage - modified drain level
* from mhitu.c:hitmu(): */
if (rn2(100) < 10 && !Drain_resistance) {
if (action == DO_DIE_CROWD) {
/* XXX these messages could be expanded */
if (Hallucination) {
if (Role_if(PM_SAMURAI))
pline("This is just like the Tokyo subway.");
else
pline("You are too near the madding crowd.");
} else {
pline("You feel crowded here.");
}
} else {
if (Hallucination) {
pline("I feel so lonely, I could die."); /* Elvis */
} else {
pline("It seems lonely here.");
}
}
losexp("Life drainage");
}
}
}
break;
case DO_LIVE:
/* continue(2/3) or create(3) */
mhere = m_at(x,y);
if(mhere) {
/*
Check the level of the surrounding monsters that are life vs
the level of the monster at this point (which may be the
hero). If the current monster is lower level, get absorbed
by the borg else (maybe) gain level.
*/
if (mhere->data != &mons[PM_MILDEW]) {
/* The only justification for this intrinsic
* polymorph resistance is to avoid
* insta-death for pets. */
if (*lslev[x][y] > mhere->m_lev && rn2(100) < 20) {
newcham(mhere, &mons[PM_MILDEW], FALSE, TRUE);
}
} else {
/* Use rn2() instead of keeping track of
* the age of each mildew. */
if (rn2(100) < 40)
grow_up(mhere, NULL);
}
} else {
if (HERO_AT(x,y) && !Upolyd && (u.umonnum != PM_MILDEW)) {
if (*lslev[x][y] > u.ulevel) {
if ((Unchanging && rn2(3)) || (rn2(100) < 50)) {
pline("You resist the urge to regress.");
} else {
polymon(PM_MILDEW);
/* polymorph will always time out so hero
* isn't stuck if sitting in a stable life
* configuration */
}
}
} else {
/* Nothing is here - birth. */
if (*ls[x][y] == 3)
(void) makemon(&mons[PM_MILDEW], x, y, MM_NOCOUNTBIRTH);
}
}
break;
default:
impossible("conway action");
}
}
}
#ifdef LDEBUG
pline("[%d %d %d %d %d %d %d %d %d %d] ",
counts[0], counts[1], counts[2], counts[3], counts[4],
counts[5], counts[6], counts[7], counts[8], counts[9]);
#endif
}
#endif
/*mkmaze.c*/

View File

@@ -1301,14 +1301,6 @@ NEARDATA struct permonst mons[] = {
M1_BREATHLESS | M1_NOEYES | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS
| M1_NOTAKE,
M2_HOSTILE | M2_NEUTER, 0, 1, CLR_BRIGHT_GREEN),
/* mildew: M1_NOEYES - should be blind but doesn't play well */
MON("mildew", S_FUNGUS,
LVL(2, 1, 9, 0, 0), (G_NOGEN|G_NOCORPSE),
A(ATTK(AT_NONE, AD_STCK, 1, 2), /*ATTK(AT_TUCH, AD_STCK, 0, 0),*/
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(20, 200, MS_SILENT, MZ_SMALL), 0, 0,
M1_BREATHLESS|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_NOTAKE|M1_REGEN|M1_OMNIVORE,
M2_HOSTILE|M2_NEUTER|M2_NASTY, 0, CLR_GRAY),
MON("brown mold", S_FUNGUS, LVL(1, 0, 9, 0, 0), (G_GENO | 1),
A(ATTK(AT_NONE, AD_COLD, 0, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
NO_ATTK),

View File

@@ -2563,8 +2563,6 @@ region *tmpregion;
}
}
/* initialization common to all special levels */
/* XXX dup name in mkmap.c */
STATIC_OVL void
wallify_map(x1, y1, x2, y2)
int x1, y1, x2, y2;
@@ -3316,10 +3314,6 @@ struct sp_coder *coder;
coder->solidify = TRUE;
if (lflags & CORRMAZE)
level.flags.corrmaze = TRUE;
#ifdef CONWAY
if (lflags & FLAG_CONWAY)
level.flags.conway = 1;
#endif
if (lflags & CHECK_INACCESSIBLES)
coder->check_inaccessibles = TRUE;