revamp baalz level
Quite a bit of special case code for something so inconsequential. Tweak the baalz level layout a little to make it be a bit more interesting, and perform custom wallification on it so that the beetle layout becomes clearly visible. It looks great with DECgraphics (and presumably IBMgraphics). It's recognizeable but not as interesting with ordinary ascii because corner walls use '-' or '|' so don't join up nicely. It looks a little weird with tiles; the square aspect ratio of individual tiles makes it end up being very elongated compared to character cell map it was designed for. As far as the level layout goes, the pair of secret doors into Baalzebub's chamber have been give a random alternative. The two right-most accessible columns were diggable--I don't know whether that was intentional; it's been reduced to one right-most column. The middle pair of legs were asymmetrical; this fixes that. The beetle also now has eyes and an entry door in its mouth.
This commit is contained in:
@@ -521,27 +521,37 @@ TRAP:"magic", random
|
||||
MAZE:"baalz",' '
|
||||
FLAGS: noteleport,corrmaze
|
||||
GEOMETRY:right,center
|
||||
# the two pools are fakes used to mark spots which need special wall fixups
|
||||
# the two iron bars are eyes and spots to their left will be made diggable
|
||||
MAP
|
||||
-------------------------------------------------
|
||||
| --- ----
|
||||
| ---- | ------------ |
|
||||
| ------ | --------|..........|---
|
||||
| |....| -------|...........--------------
|
||||
| ---- ----
|
||||
| ---- | ----------- |
|
||||
| ------ | ---------|.........|--P
|
||||
| F....| -------|...........--------------
|
||||
---....|--|..................S............|----
|
||||
....--....S..----------------|............S...|
|
||||
+...--....S..----------------|............S...|
|
||||
---....|--|..................|............|----
|
||||
| |....| -------|...........-----S--------
|
||||
| ------ | --------|..........|---
|
||||
| ---- | ------------ |
|
||||
| --- ----
|
||||
| F....| -------|...........-----S--------
|
||||
| ------ | ---------|.........|--P
|
||||
| ---- | ----------- |
|
||||
| ---- ----
|
||||
-------------------------------------------------
|
||||
ENDMAP
|
||||
STAIR:levregion(01,00,15,20),levregion(15,1,70,16),up
|
||||
BRANCH:levregion(01,00,15,20),levregion(15,1,70,16)
|
||||
TELEPORT_REGION:levregion(01,00,15,20),levregion(15,1,70,16)
|
||||
NON_DIGGABLE:(00,00,46,12)
|
||||
# this actually leaves the farthest right column diggable
|
||||
NON_DIGGABLE:(00,00,47,12)
|
||||
MAZEWALK:(00,06),west
|
||||
STAIR:(44,06),down
|
||||
DOOR:locked,(00,06)
|
||||
IF [50%] {
|
||||
TERRAIN:(34,08),'-'
|
||||
TERRAIN:(34,04),'S'
|
||||
TERRAIN:(29,05),'|'
|
||||
TERRAIN:(29,07),'S'
|
||||
}
|
||||
# The fellow in residence
|
||||
MONSTER:('&',"Baalzebub"),(35,06)
|
||||
# Some random weapons and armor.
|
||||
|
||||
@@ -197,6 +197,7 @@ when using the 'O' command for regexp options (autopickup exceptions,
|
||||
at a time [after 'add', return to add/list/remove menu]
|
||||
commands invoked by uppercase meta characters: M-A, M-C, M-N, M-O, M-R, M-T
|
||||
were missing from '? c' list of game commands (dat/hh)
|
||||
tweak Baalzebub's lair and clean up the map display for it
|
||||
|
||||
post-3.6.0: fix "object lost" panic during pickup caused by sortloot revamp
|
||||
post-3.6.0: more sortloot revisions
|
||||
|
||||
136
src/mkmaze.c
136
src/mkmaze.c
@@ -9,9 +9,11 @@
|
||||
/* from sp_lev.c, for fixup_special() */
|
||||
extern lev_region *lregions;
|
||||
extern int num_lregions;
|
||||
/* for preserving the insect legs when wallifying baalz level */
|
||||
static lev_region bughack = { {COLNO, ROWNO, 0, 0}, {COLNO, ROWNO, 0, 0} };
|
||||
|
||||
STATIC_DCL boolean FDECL(iswall, (int, int));
|
||||
STATIC_DCL boolean FDECL(iswall_or_stone, (int, int));
|
||||
STATIC_DCL int FDECL(iswall, (int, int));
|
||||
STATIC_DCL int FDECL(iswall_or_stone, (int, int));
|
||||
STATIC_DCL boolean FDECL(is_solid, (int, int));
|
||||
STATIC_DCL int FDECL(extend_spine, (int[3][3], int, int, int));
|
||||
STATIC_DCL boolean FDECL(okay, (int, int, int));
|
||||
@@ -19,6 +21,7 @@ STATIC_DCL void FDECL(maze0xy, (coord *));
|
||||
STATIC_DCL boolean FDECL(put_lregion_here, (XCHAR_P, XCHAR_P, XCHAR_P,
|
||||
XCHAR_P, XCHAR_P, XCHAR_P,
|
||||
XCHAR_P, BOOLEAN_P, d_level *));
|
||||
STATIC_DCL void NDECL(baalz_fixup);
|
||||
STATIC_DCL void NDECL(setup_waterlevel);
|
||||
STATIC_DCL void NDECL(unsetup_waterlevel);
|
||||
|
||||
@@ -34,33 +37,28 @@ STATIC_DCL void NDECL(unsetup_waterlevel);
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
STATIC_OVL boolean
|
||||
STATIC_OVL int
|
||||
iswall(x, y)
|
||||
int x, y;
|
||||
{
|
||||
register int type;
|
||||
|
||||
if (!isok(x, y))
|
||||
return FALSE;
|
||||
return 0;
|
||||
type = levl[x][y].typ;
|
||||
return (boolean) (IS_WALL(type) || IS_DOOR(type)
|
||||
return (IS_WALL(type) || IS_DOOR(type)
|
||||
|| type == SDOOR || type == IRONBARS);
|
||||
}
|
||||
|
||||
STATIC_OVL boolean
|
||||
STATIC_OVL int
|
||||
iswall_or_stone(x, y)
|
||||
int x, y;
|
||||
{
|
||||
register int type;
|
||||
|
||||
/* out of bounds = stone */
|
||||
if (!isok(x, y))
|
||||
return TRUE;
|
||||
return 1;
|
||||
|
||||
type = levl[x][y].typ;
|
||||
return (boolean) (type == STONE
|
||||
|| IS_WALL(type) || IS_DOOR(type)
|
||||
|| type == SDOOR || type == IRONBARS);
|
||||
return (levl[x][y].typ == STONE || iswall(x, y));
|
||||
}
|
||||
|
||||
/* return TRUE if out of bounds, wall or rock */
|
||||
@@ -138,6 +136,10 @@ int x1, y1, x2, y2;
|
||||
/* change walls surrounded by rock to rock. */
|
||||
for (x = x1; x <= x2; x++)
|
||||
for (y = y1; y <= y2; y++) {
|
||||
if (within_bounded_area(x, y,
|
||||
bughack.inarea.x1, bughack.inarea.y1,
|
||||
bughack.inarea.x2, bughack.inarea.y2))
|
||||
continue;
|
||||
lev = &levl[x][y];
|
||||
type = lev->typ;
|
||||
if (IS_WALL(type) && type != DBWALL) {
|
||||
@@ -158,6 +160,7 @@ int x1, y1, x2, y2;
|
||||
uchar type;
|
||||
register int x,y;
|
||||
struct rm *lev;
|
||||
int FDECL((*loc_f), (int, int));
|
||||
int bits;
|
||||
int locale[3][3]; /* rock or wall status surrounding positions */
|
||||
|
||||
@@ -184,16 +187,21 @@ int x1, y1, x2, y2;
|
||||
continue;
|
||||
|
||||
/* set the locations TRUE if rock or wall or out of bounds */
|
||||
locale[0][0] = iswall_or_stone(x - 1, y - 1);
|
||||
locale[1][0] = iswall_or_stone(x, y - 1);
|
||||
locale[2][0] = iswall_or_stone(x + 1, y - 1);
|
||||
loc_f = within_bounded_area(x, y, /* for baalz insect */
|
||||
bughack.inarea.x1, bughack.inarea.y1,
|
||||
bughack.inarea.x2, bughack.inarea.y2)
|
||||
? iswall
|
||||
: iswall_or_stone;
|
||||
locale[0][0] = (*loc_f)(x - 1, y - 1);
|
||||
locale[1][0] = (*loc_f)(x, y - 1);
|
||||
locale[2][0] = (*loc_f)(x + 1, y - 1);
|
||||
|
||||
locale[0][1] = iswall_or_stone(x - 1, y);
|
||||
locale[2][1] = iswall_or_stone(x + 1, y);
|
||||
locale[0][1] = (*loc_f)(x - 1, y);
|
||||
locale[2][1] = (*loc_f)(x + 1, y);
|
||||
|
||||
locale[0][2] = iswall_or_stone(x - 1, y + 1);
|
||||
locale[1][2] = iswall_or_stone(x, y + 1);
|
||||
locale[2][2] = iswall_or_stone(x + 1, y + 1);
|
||||
locale[0][2] = (*loc_f)(x - 1, y + 1);
|
||||
locale[1][2] = (*loc_f)(x, y + 1);
|
||||
locale[2][2] = (*loc_f)(x + 1, y + 1);
|
||||
|
||||
/* determine if wall should extend to each direction NSEW */
|
||||
bits = (extend_spine(locale, iswall(x, y - 1), 0, -1) << 3)
|
||||
@@ -358,6 +366,89 @@ d_level *lev;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* fix up Baalzebub's lair, which depicts a level-sized beetle;
|
||||
its legs are walls within solid rock--regular wallification
|
||||
classifies them as superfluous and gets rid of them */
|
||||
STATIC_OVL void
|
||||
baalz_fixup()
|
||||
{
|
||||
int x, y, lastx, lasty;
|
||||
|
||||
/*
|
||||
* baalz level's nondiggable region surrounds the "insect" and rooms.
|
||||
* The outermost perimeter of that region is subject to wall cleanup
|
||||
* (hence 'x + 1' and 'y + 1' for starting don't-clean column and row,
|
||||
* 'lastx - 1' and 'lasty - 1' for ending don't-clean column and row)
|
||||
* and the interior is protected against that (in wall_cleanup()).
|
||||
*
|
||||
* Assumes level.flags.corrmaze, otherwise the bug legs will have
|
||||
* already been "cleaned" away by general wallification.
|
||||
*/
|
||||
|
||||
/* find low and high x for to-be-wallified portion of level */
|
||||
y = ROWNO / 2;
|
||||
for (lastx = x = 0; x < COLNO; ++x)
|
||||
if ((levl[x][y].wall_info & W_NONDIGGABLE) != 0) {
|
||||
if (!lastx)
|
||||
bughack.inarea.x1 = x + 1;
|
||||
lastx = x;
|
||||
}
|
||||
bughack.inarea.x2 = ((lastx > bughack.inarea.x1) ? lastx : x) - 1;
|
||||
/* find low and high y for to-be-wallified portion of level */
|
||||
x = bughack.inarea.x1;
|
||||
for (lasty = y = 0; y < ROWNO; ++y)
|
||||
if ((levl[x][y].wall_info & W_NONDIGGABLE) != 0) {
|
||||
if (!lasty)
|
||||
bughack.inarea.y1 = y + 1;
|
||||
lasty = y;
|
||||
}
|
||||
bughack.inarea.y2 = ((lasty > bughack.inarea.y1) ? lasty : y) - 1;
|
||||
/* two pools mark where special post-wallify fix-ups are needed */
|
||||
for (x = bughack.inarea.x1; x <= bughack.inarea.x2; ++x)
|
||||
for (y = bughack.inarea.y1; y <= bughack.inarea.y2; ++y)
|
||||
if (levl[x][y].typ == POOL) {
|
||||
levl[x][y].typ = HWALL;
|
||||
if (bughack.delarea.x1 == COLNO)
|
||||
bughack.delarea.x1 = x, bughack.delarea.y1 = y;
|
||||
else
|
||||
bughack.delarea.x2 = x, bughack.delarea.y2 = y;
|
||||
} else if (levl[x][y].typ == IRONBARS) {
|
||||
/* novelty effect; allowing digging in front of 'eyes' */
|
||||
levl[x - 1][y].wall_info &= ~W_NONDIGGABLE;
|
||||
if (isok(x - 2, y))
|
||||
levl[x - 2][y].wall_info &= ~W_NONDIGGABLE;
|
||||
}
|
||||
|
||||
wallification(max(bughack.inarea.x1 - 2, 1),
|
||||
max(bughack.inarea.y1 - 2, 0),
|
||||
min(bughack.inarea.x2 + 2, COLNO - 1),
|
||||
min(bughack.inarea.y2 + 2, ROWNO - 1));
|
||||
|
||||
/* bughack hack for rear-most legs on baalz level; first joint on
|
||||
both top and bottom gets a bogus extra connection to room area,
|
||||
producing unwanted rectangles; change back to separated legs */
|
||||
x = bughack.delarea.x1, y = bughack.delarea.y1;
|
||||
if (isok(x, y) && levl[x][y].typ == TLWALL
|
||||
&& isok(x, y + 1) && levl[x][y + 1].typ == TUWALL) {
|
||||
levl[x][y].typ = BRCORNER;
|
||||
levl[x][y + 1].typ = HWALL;
|
||||
}
|
||||
x = bughack.delarea.x2, y = bughack.delarea.y2;
|
||||
if (isok(x, y) && levl[x][y].typ == TLWALL
|
||||
&& isok(x, y - 1) && levl[x][y - 1].typ == TDWALL) {
|
||||
levl[x][y].typ = TRCORNER;
|
||||
levl[x][y - 1].typ = HWALL;
|
||||
}
|
||||
|
||||
/* reset bughack region; set low end to <COLNO,ROWNO> so that
|
||||
within_bounded_region() in fix_wall_spines() will fail
|
||||
most quickly--on its first test--when loading other levels */
|
||||
bughack.inarea.x1 = bughack.delarea.x1 = COLNO;
|
||||
bughack.inarea.y1 = bughack.delarea.y1 = ROWNO;
|
||||
bughack.inarea.x2 = bughack.delarea.x2 = 0;
|
||||
bughack.inarea.y2 = bughack.delarea.y2 = 0;
|
||||
}
|
||||
|
||||
static boolean was_waterlevel; /* ugh... this shouldn't be needed */
|
||||
|
||||
/* this is special stuff that the level compiler cannot (yet) handle */
|
||||
@@ -512,6 +603,9 @@ fixup_special()
|
||||
if (mtmp->isshk)
|
||||
mongone(mtmp);
|
||||
}
|
||||
} else if (on_level(&u.uz, &baalzebub_level)) {
|
||||
/* custom wallify the "beetle" potion of the level */
|
||||
baalz_fixup();
|
||||
}
|
||||
|
||||
if (lregions)
|
||||
|
||||
Reference in New Issue
Block a user