Catch up with post-343 lev_comp changes

- Iced pools vs. iced moats
- allow making map outer edges nonpasswall & nondiggable,
  so eg. xorns cannot be teleported there
This commit is contained in:
Pasi Kallinen
2015-02-25 20:35:25 +02:00
parent b5dd0c1894
commit 56699486a0
6 changed files with 63 additions and 34 deletions

View File

@@ -11,7 +11,7 @@
# and receive your quest assignment.
#
MAZE: "Val-strt",' '
FLAGS: noteleport,hardfloor
FLAGS: noteleport,hardfloor,icedpools
GEOMETRY:center,center
MAP
IIIIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
@@ -90,7 +90,7 @@ MONSTER: ('H',"fire giant"),(10,16),hostile
#
MAZE: "Val-loca",' '
FLAGS: hardfloor
FLAGS: hardfloor,icedpools
INIT_MAP: mines, '.', 'I', true, true, lit, false
GEOMETRY:center,center
MAP
@@ -176,6 +176,7 @@ MONSTER:'H',random,hostile
#
MAZE: "Val-goal", 'L'
FLAGS: icedpools
INIT_MAP: mines, '.', 'L', true, true, lit, false
GEOMETRY:center,center
MAP
@@ -266,6 +267,7 @@ MONSTER:'H',random,hostile
#
MAZE: "Val-fila" , 'I'
FLAGS: icedpools
INIT_MAP: mines, '.', 'I', true, true, lit, false
NOMAP
#
@@ -299,6 +301,7 @@ TRAP: random, random
TRAP: random, random
MAZE: "Val-filb" , 'L'
FLAGS: icedpools
INIT_MAP: mines, '.', 'L', true, true, lit, false
NOMAP
#

View File

@@ -35,7 +35,7 @@
### Bottom (first) level of Sokoban ###
MAZE:"soko4-1",' '
FLAGS:noteleport,hardfloor,premapped
FLAGS:noteleport,hardfloor,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -98,7 +98,7 @@ OBJECT:'/',random
MAZE:"soko4-2",' '
FLAGS:noteleport,hardfloor,premapped
FLAGS:noteleport,hardfloor,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -163,7 +163,7 @@ OBJECT:'/',random
### Second level ###
MAZE:"soko3-1",' '
FLAGS:noteleport,premapped
FLAGS:noteleport,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -239,7 +239,7 @@ OBJECT:'/',random
MAZE:"soko3-2",' '
FLAGS:noteleport,premapped
FLAGS:noteleport,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -308,7 +308,7 @@ OBJECT:'/',random
### Third level ###
MAZE:"soko2-1",' '
FLAGS:noteleport,premapped
FLAGS:noteleport,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -373,7 +373,7 @@ OBJECT:'/',random
MAZE:"soko2-2",' '
FLAGS:noteleport,premapped
FLAGS:noteleport,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -440,7 +440,7 @@ OBJECT:'/',random
### Top (last) level of Sokoban ###
MAZE:"soko1-1",' '
FLAGS:noteleport,premapped
FLAGS:noteleport,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -538,7 +538,7 @@ ENGRAVING:$place[0],burn,"Elbereth"
MAZE:"soko1-2",' '
FLAGS:noteleport,premapped
FLAGS:noteleport,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP

View File

@@ -6,7 +6,7 @@
#
# Upper stage of Vlad's tower
MAZE:"tower1",' '
FLAGS: noteleport,hardfloor
FLAGS: noteleport,hardfloor,solidify
GEOMETRY:half-left,center
MAP
--- --- ---
@@ -52,7 +52,7 @@ NON_DIGGABLE:(00,00,14,10)
# Intermediate stage of Vlad's tower
MAZE:"tower2",' '
FLAGS: noteleport,hardfloor
FLAGS: noteleport,hardfloor,solidify
GEOMETRY:half-left,center
MAP
--- --- ---
@@ -95,7 +95,7 @@ NON_DIGGABLE:(00,00,14,10)
# Bottom most stage of Vlad's tower
MAZE:"tower3",' '
FLAGS: noteleport,hardfloor
FLAGS: noteleport,hardfloor,solidify
GEOMETRY:half-left,center
MAP
--- --- ---

View File

@@ -28,7 +28,8 @@
#define PREMAPPED 0x00000040L /* premapped level & sokoban rules */
#define SHROUD 0x00000080L
#define GRAVEYARD 0x00000100L
#define ICEDPOOLS 0x00000200L /* for ice locations: ICED_POOL vs ICED_MOAT */
#define SOLIDIFY 0x00000400L /* outer areas are nondiggable & nonpasswall */
/* different level layout initializers */
#define LVLINIT_NONE 0
@@ -278,8 +279,8 @@ struct sp_frame {
struct sp_coder {
struct splevstack *stack;
struct sp_frame *frame;
/*int allow_flips;*/
int premapped;
boolean solidify;
struct mkroom *croom;
struct mkroom *tmproomlist[MAX_NESTED_ROOMS+1];
boolean failed_room[MAX_NESTED_ROOMS+1];
@@ -331,7 +332,7 @@ typedef struct {
char fg, bg;
boolean smoothed, joined;
xchar lit, walled;
boolean icedpools; /* for ice locations: ICED_POOL vs ICED_MOAT */
boolean icedpools;
} lev_init;
typedef struct {

View File

@@ -60,7 +60,9 @@ extern struct engr *head_engr;
extern int min_rx, max_rx, min_ry, max_ry; /* from mkmap.c */
/* positions touched by level elements explicitly defined in the des-file */
static char SpLev_Map[COLNO][ROWNO];
static aligntyp ralign[3] = { AM_CHAOTIC, AM_NEUTRAL, AM_LAWFUL };
static NEARDATA xchar xstart, ystart;
static NEARDATA char xsize, ysize;
@@ -78,6 +80,8 @@ struct mkroom * FDECL(build_room, (room *, struct mkroom *));
char *lev_message = 0;
lev_region *lregions = 0;
int num_lregions = 0;
boolean splev_init_present = FALSE;
boolean icedpools = FALSE;
struct obj *container_obj[MAX_CONTAINMENT];
int container_idx = 0;
@@ -86,6 +90,16 @@ struct monst *invent_carrying_monster = NULL;
#define SPLEV_STACK_RESERVE 128
void
solidify_map()
{
xchar x, y;
for (x = 0; x < COLNO; x++)
for (y = 0; y < ROWNO; y++)
if (IS_STWALL(levl[x][y].typ) && !SpLev_Map[x][y])
levl[x][y].wall_info |= (W_NONDIGGABLE|W_NONPASSWALL);
}
void
splev_stack_init(st)
struct splevstack *st;
@@ -502,7 +516,7 @@ remove_boundary_syms()
if (has_bounds) {
for(x = 0; x < x_maze_max; x++)
for(y = 0; y < y_maze_max; y++)
if ((levl[x][y].typ == CROSSWALL) && !SpLev_Map[x][y])
if ((levl[x][y].typ == CROSSWALL) && SpLev_Map[x][y])
levl[x][y].typ = ROOM;
}
}
@@ -1504,7 +1518,7 @@ struct mkroom *croom;
if (o->corpsenm != NON_PM) {
if (o->corpsenm == NON_PM - 1)
set_corpsenm(otmp, rndmonnum());
else set_corpsenm(otmp, o->corpsenm);
else set_corpsenm(otmp, o->corpsenm);
}
/* set_corpsenm() took care of egg hatch and corpse timers */
@@ -1603,11 +1617,14 @@ struct mkroom *croom;
for (wastyp = otmp->corpsenm; i < 1000 ; i++, wastyp = rndmonnum()) {
/* makemon without rndmonst() might create a group */
was = makemon(&mons[wastyp], 0, 0, MM_NOCOUNTBIRTH);
if (was && !resists_ston(was)) {
if (was) {
if (!resists_ston(was)) {
(void) propagate(wastyp, TRUE, FALSE);
break;
}
mongone(was);
was = NULL;
}
mongone(was);
}
if (was) {
set_corpsenm(otmp, wastyp);
@@ -2166,7 +2183,7 @@ fill_empty_maze()
for(x = 2; x < x_maze_max; x++)
for(y = 0; y < y_maze_max; y++)
if(!SpLev_Map[x][y]) mapcount--;
if(SpLev_Map[x][y]) mapcount--;
if ((mapcount > (int) (mapcountmax / 10))) {
mapfact = (int) ((mapcount * 100L) / mapcountmax);
@@ -2321,6 +2338,7 @@ lev_init *linit;
case LVLINIT_MINES:
if (linit->lit == -1) linit->lit = rn2(2);
if (linit->filling > -1) lvlfill_solid(linit->filling, 0);
linit->icedpools = icedpools;
mkmap(linit);
break;
}
@@ -2796,6 +2814,8 @@ spo_level_flags(coder)
if (flags & PREMAPPED) coder->premapped = TRUE;
if (flags & SHROUD) level.flags.hero_memory = 0;
if (flags & GRAVEYARD) level.flags.graveyard = 1;
if (flags & ICEDPOOLS) icedpools = TRUE;
if (flags & SOLIDIFY) coder->solidify = TRUE;
opvar_free(flagdata);
}
@@ -2816,6 +2836,8 @@ spo_initlevel(coder)
!OV_pop_i(filling) ||
!OV_pop_i(init_style)) return;
splev_init_present = TRUE;
init_lev.init_style = OV_i(init_style);
init_lev.fg = OV_i(fg);
init_lev.bg = OV_i(bg);
@@ -2978,16 +3000,10 @@ spo_stair(coder)
if (!OV_pop_i(up) ||
!OV_pop_c(coord)) return;
if (coder->croom) {
get_location_coord(&x, &y, DRY, coder->croom, OV_i(coord));
mkstairs(x,y,(char)OV_i(up), coder->croom);
SpLev_Map[x][y] = 1;
} else {
get_location_coord(&x, &y, DRY, coder->croom, OV_i(coord));
if ((badtrap = t_at(x,y)) != 0) deltrap(badtrap);
mkstairs(x, y, (char)OV_i(up), coder->croom);
SpLev_Map[x][y] = 1;
}
get_location_coord(&x, &y, DRY, coder->croom, OV_i(coord));
if ((badtrap = t_at(x,y)) != 0) deltrap(badtrap);
mkstairs(x, y, (char)OV_i(up), coder->croom);
SpLev_Map[x][y] = 1;
opvar_free(coord);
opvar_free(up);
@@ -3647,7 +3663,7 @@ sel_set_door(dx,dy,arg)
typ = D_CLOSED;
}
levl[x][y].doormask = typ;
/*SpLev_Map[x][y] = 1;*/
SpLev_Map[x][y] = 1;
/* Now the complicated part, list it with each subroom */
/* The dog move and mail daemon routines use this */
@@ -4166,7 +4182,7 @@ redo_maploc:
break;
case 1:
switch((int) halign) {
case LEFT: xstart = 3; break;
case LEFT: xstart = splev_init_present ? 1 : 3; break;
case H_LEFT: xstart = 2+((x_maze_max-2-xsize)/4); break;
case CENTER: xstart = 2+((x_maze_max-2-xsize)/2); break;
case H_RIGHT: xstart = 2+((x_maze_max-2-xsize)*3/4); break;
@@ -4220,6 +4236,7 @@ redo_maploc:
levl[x][y].horizontal = 0;
levl[x][y].roomno = 0;
levl[x][y].edge = 0;
SpLev_Map[x][y] = 1;
/*
* Set secret doors to closed (why not trapped too?). Set
* the horizontal bit.
@@ -4240,6 +4257,8 @@ redo_maploc:
levl[x][y].horizontal = 1;
else if(levl[x][y].typ == LAVAPOOL)
levl[x][y].lit = 1;
else if (splev_init_present && levl[x][y].typ == ICE)
levl[x][y].icedpool = icedpools ? ICED_POOL : ICED_MOAT;
}
if (coder->lvl_is_joined)
remove_rooms(xstart, ystart, xstart+xsize, ystart+ysize);
@@ -4488,12 +4507,15 @@ sp_lev *lvl;
coder->frame = frame_new(0);
coder->stack = NULL;
coder->premapped = FALSE;
/*coder->allow_flips = 3;*/
coder->solidify = FALSE;
coder->croom = NULL;
coder->n_subroom = 1;
coder->exit_script = FALSE;
coder->lvl_is_joined = 0;
splev_init_present = FALSE;
icedpools = FALSE;
if (wizard) {
char *met = nh_getenv("SPCODER_MAX_RUNTIME");
if (met && met[0] == '1') max_execution = (1<<30) - 1;
@@ -5044,6 +5066,7 @@ next_opcode:
count_features();
if (coder->premapped) sokoban_detect();
if (coder->solidify) solidify_map();
if (coder->frame) {
struct sp_frame *tmpframe;

View File

@@ -293,6 +293,8 @@ mazelevel { savetoken(yytext); yylval.i=MAZELEVEL; return FLAG_TYPE; }
premapped { savetoken(yytext); yylval.i=PREMAPPED; return FLAG_TYPE; }
shroud { savetoken(yytext); yylval.i=SHROUD; return FLAG_TYPE; }
graveyard { savetoken(yytext); yylval.i=GRAVEYARD; return FLAG_TYPE; }
icedpools { savetoken(yytext); yylval.i=ICEDPOOLS; return FLAG_TYPE; }
solidify { savetoken(yytext); yylval.i=SOLIDIFY; return FLAG_TYPE; }
[0-9]+d[0-9]+ { char *p = strchr(yytext, 'd');
savetoken(yytext);
if (p) {