diff -u -p -r src-3.0.6/src/cave.c src-dtrap/src/cave.c --- src-3.0.6/src/cave.c 2005-02-06 14:28:26.000000000 +0000 +++ src-dtrap/src/cave.c 2006-01-30 17:27:17.000000000 +0000 @@ -3883,6 +3883,7 @@ void wiz_dark(void) { /* Process the grid */ cave_info[y][x] &= ~(CAVE_MARK); + cave_info2[y][x] &= ~(CAVE2_DTRAP); } } diff -u -p -r src-3.0.6/src/cmd1.c src-dtrap/src/cmd1.c --- src-3.0.6/src/cmd1.c 2005-02-23 21:00:45.000000000 +0000 +++ src-dtrap/src/cmd1.c 2006-01-30 16:51:30.000000000 +0000 @@ -1231,6 +1231,9 @@ void move_player(int dir, int jumping) int y, x; + bool old_dtrap, new_dtrap; + + /* Find the result of moving */ y = py + ddy[dir]; x = px + ddx[dir]; @@ -1330,8 +1333,27 @@ void move_player(int dir, int jumping) /* Sound XXX XXX XXX */ /* sound(MSG_WALK); */ - /* Move player */ - monster_swap(py, px, y, x); + /* See if trap detection status will change */ + old_dtrap = ((cave_info2[py][px] & (CAVE2_DTRAP)) != 0); + new_dtrap = ((cave_info2[y][x] & (CAVE2_DTRAP)) != 0); + + /* Note the change in the detect status */ + if (old_dtrap != new_dtrap) p_ptr->redraw |= (PR_DTRAP); + + /* Disturb player if the player is about to leave the detect area XXX */ + if (disturb_detect && p_ptr->running && old_dtrap && !new_dtrap) + { + /* Disturb the player */ + disturb(0, 0); + + /* Done XXX */ + return; + } + + /* Move player */ + monster_swap(py, px, y, x); + + /* New location */ y = py = p_ptr->py; diff -u -p -r src-3.0.6/src/defines.h src-dtrap/src/defines.h --- src-3.0.6/src/defines.h 2005-06-18 18:37:15.000000000 +0100 +++ src-dtrap/src/defines.h 2006-01-30 16:42:32.000000000 +0000 @@ -531,14 +531,17 @@ #define ROW_STATE (Term->hgt - 1) #define COL_STATE 38 /* */ +#define ROW_DTRAP (Term->hgt - 1) +#define COL_DTRAP 49 /* "DTrap" */ + #define ROW_SPEED (Term->hgt - 1) -#define COL_SPEED 49 /* "Slow (-NN)" or "Fast (+NN)" */ +#define COL_SPEED 55 /* "Slow (-NN)" or "Fast (+NN)" */ #define ROW_STUDY (Term->hgt - 1) -#define COL_STUDY 64 /* "Study" */ +#define COL_STUDY 66 /* "Study" */ #define ROW_DEPTH (Term->hgt - 1) -#define COL_DEPTH 70 /* "Lev NNN" / "NNNN ft" */ +#define COL_DEPTH 72 /* "Lev NNN" / "NNNN ft" */ #define ROW_OPPOSE_ELEMENTS (Term->hgt - 1) #define COL_OPPOSE_ELEMENTS 80 /* "Acid Elec Fire Cold Pois" */ @@ -1618,7 +1621,7 @@ #define PR_CUT 0x00001000L /* Display Extra (Cut) */ #define PR_STUN 0x00002000L /* Display Extra (Stun) */ #define PR_HUNGER 0x00004000L /* Display Extra (Hunger) */ -/* xxx */ +#define PR_DTRAP 0x00008000L /* Display Extra (Trap detection) */ #define PR_BLIND 0x00010000L /* Display Extra (Blind) */ #define PR_CONFUSED 0x00020000L /* Display Extra (Confused) */ #define PR_AFRAID 0x00040000L /* Display Extra (Afraid) */ @@ -1679,6 +1682,7 @@ #define CAVE_TEMP 0x40 /* temp flag */ #define CAVE_WALL 0x80 /* wall flag */ +#define CAVE2_DTRAP 0x01 /* trap detected grid */ /*** Object flags ***/ @@ -2418,7 +2422,7 @@ #define OPT_run_use_corners 19 #define OPT_disturb_move 20 #define OPT_disturb_near 21 -#define OPT_disturb_panel 22 +#define OPT_disturb_detect 22 #define OPT_disturb_state 23 #define OPT_disturb_minor 24 /* xxx OPT_disturb_other */ @@ -2538,7 +2542,7 @@ #define run_use_corners op_ptr->opt[OPT_run_use_corners] #define disturb_move op_ptr->opt[OPT_disturb_move] #define disturb_near op_ptr->opt[OPT_disturb_near] -#define disturb_panel op_ptr->opt[OPT_disturb_panel] +#define disturb_detect op_ptr->opt[OPT_disturb_detect] #define disturb_state op_ptr->opt[OPT_disturb_state] #define disturb_minor op_ptr->opt[OPT_disturb_minor] /* xxx disturb_other */ diff -u -p -r src-3.0.6/src/externs.h src-dtrap/src/externs.h --- src-3.0.6/src/externs.h 2005-02-08 10:46:02.000000000 +0000 +++ src-dtrap/src/externs.h 2006-01-30 16:31:06.000000000 +0000 @@ -147,6 +147,7 @@ extern u16b *temp_g; extern byte *temp_y; extern byte *temp_x; extern byte (*cave_info)[256]; +extern byte (*cave_info2)[256]; extern byte (*cave_feat)[DUNGEON_WID]; extern s16b (*cave_o_idx)[DUNGEON_WID]; extern s16b (*cave_m_idx)[DUNGEON_WID]; diff -u -p -r src-3.0.6/src/generate.c src-dtrap/src/generate.c --- src-3.0.6/src/generate.c 2004-05-31 16:15:23.000000000 +0100 +++ src-dtrap/src/generate.c 2006-01-30 16:36:51.000000000 +0000 @@ -3383,6 +3383,7 @@ void generate_cave(void) { /* No flags */ cave_info[y][x] = 0; + cave_info2[y][x] = 0; /* No features */ cave_feat[y][x] = 0; diff -u -p -r src-3.0.6/src/init2.c src-dtrap/src/init2.c --- src-3.0.6/src/init2.c 2005-01-16 14:35:57.000000000 +0000 +++ src-dtrap/src/init2.c 2006-01-30 16:36:37.000000000 +0000 @@ -1373,6 +1373,7 @@ static errr init_other(void) /* Padded into array */ C_MAKE(cave_info, DUNGEON_HGT, byte_256); + C_MAKE(cave_info2, DUNGEON_HGT, byte_256); /* Feature array */ C_MAKE(cave_feat, DUNGEON_HGT, byte_wid); @@ -2103,6 +2104,7 @@ void cleanup_angband(void) FREE(cave_o_idx); FREE(cave_m_idx); FREE(cave_feat); + FREE(cave_info2); FREE(cave_info); /* Free the "update_view()" array */ diff -u -p -r src-3.0.6/src/load.c src-dtrap/src/load.c --- src-3.0.6/src/load.c 2005-05-07 13:30:37.000000000 +0100 +++ src-dtrap/src/load.c 2006-01-30 16:34:16.000000000 +0000 @@ -1501,6 +1501,31 @@ static errr rd_dungeon(void) } } + /* Load the dungeon data */ + for (x = y = 0; y < DUNGEON_HGT; ) + { + /* Grab RLE info */ + rd_byte(&count); + rd_byte(&tmp8u); + + /* Apply the RLE info */ + for (i = count; i > 0; i--) + { + /* Extract "info" */ + cave_info2[y][x] = tmp8u; + + /* Advance/Wrap */ + if (++x >= DUNGEON_WID) + { + /* Wrap */ + x = 0; + + /* Advance/Wrap */ + if (++y >= DUNGEON_HGT) break; + } + } + } + /*** Run length decoding ***/ diff -u -p -r src-3.0.6/src/monster2.c src-dtrap/src/monster2.c --- src-3.0.6/src/monster2.c 2004-05-31 13:01:32.000000000 +0100 +++ src-dtrap/src/monster2.c 2006-01-30 16:40:56.000000000 +0000 @@ -1329,6 +1329,9 @@ void monster_swap(int y1, int x1, int y2 p_ptr->py = y2; p_ptr->px = x2; + /* Update the trap detection status */ + p_ptr->redraw |= (PR_DTRAP); + /* Update the panel */ p_ptr->update |= (PU_PANEL); @@ -1362,6 +1365,9 @@ void monster_swap(int y1, int x1, int y2 p_ptr->py = y1; p_ptr->px = x1; + /* Update the trap detection status */ + p_ptr->redraw |= (PR_DTRAP); + /* Update the panel */ p_ptr->update |= (PU_PANEL); diff -u -p -r src-3.0.6/src/save.c src-dtrap/src/save.c --- src-3.0.6/src/save.c 2004-02-05 20:25:15.000000000 +0000 +++ src-dtrap/src/save.c 2006-01-30 16:33:53.000000000 +0000 @@ -1256,6 +1256,44 @@ static void wr_dungeon(void) wr_byte((byte)prev_char); } + /** Now dump the cave_info2[][] stuff **/ + + /* Note that this will induce two wasted bytes */ + count = 0; + prev_char = 0; + + /* Dump the cave */ + for (y = 0; y < DUNGEON_HGT; y++) + { + for (x = 0; x < DUNGEON_WID; x++) + { + /* Keep all the information from info2 */ + tmp8u = cave_info2[y][x]; + + /* If the run is broken, or too full, flush it */ + if ((tmp8u != prev_char) || (count == MAX_UCHAR)) + { + wr_byte((byte)count); + wr_byte((byte)prev_char); + prev_char = tmp8u; + count = 1; + } + + /* Continue the run */ + else + { + count++; + } + } + } + + /* Flush the data (if any) */ + if (count) + { + wr_byte((byte)count); + wr_byte((byte)prev_char); + } + /*** Simple "Run-Length-Encoding" of cave ***/ diff -u -p -r src-3.0.6/src/spells2.c src-dtrap/src/spells2.c --- src-3.0.6/src/spells2.c 2005-05-07 17:16:29.000000000 +0100 +++ src-dtrap/src/spells2.c 2006-01-30 17:37:40.000000000 +0000 @@ -999,20 +999,24 @@ bool detect_traps(void) /* Redraw */ lite_spot(y, x); - /* Obvious */ + /* We found something to detect */ detect = TRUE; } + + /* Mark as trap-detected */ + cave_info2[y][x] |= (CAVE2_DTRAP); } } /* Describe */ if (detect) - { msg_print("You sense the presence of traps!"); - } + + /* Mark the redraw flag */ + p_ptr->redraw |= (PR_DTRAP); /* Result */ - return (detect); + return (TRUE); } Only in src-dtrap/src: spells2.o Only in src-dtrap/src: store.o diff -u -p -r src-3.0.6/src/tables.c src-dtrap/src/tables.c --- src-3.0.6/src/tables.c 2004-09-25 10:50:00.000000000 +0100 +++ src-dtrap/src/tables.c 2006-01-30 16:40:57.000000000 +0000 @@ -1418,7 +1418,7 @@ cptr option_text[OPT_MAX] = "run_use_corners", /* OPT_run_use_corners */ "disturb_move", /* OPT_disturb_move */ "disturb_near", /* OPT_disturb_near */ - "disturb_panel", /* OPT_disturb_panel */ + "disturb_detect", /* OPT_disturb_detect */ "disturb_state", /* OPT_disturb_state */ "disturb_minor", /* OPT_disturb_minor */ NULL, /* xxx disturb_other */ @@ -1682,7 +1682,7 @@ cptr option_desc[OPT_MAX] = "When running, use corners", /* OPT_run_use_corners */ "Disturb whenever any monster moves", /* OPT_disturb_move */ "Disturb whenever viewable monster moves", /* OPT_disturb_near */ - "Disturb whenever map panel changes", /* OPT_disturb_panel */ + "Disturb whenever leaving trap detected area", /* OPT_disturb_detect */ "Disturb whenever player state changes", /* OPT_disturb_state */ "Disturb whenever boring things happen", /* OPT_disturb_minor */ NULL, /* xxx disturb_other */ @@ -1946,7 +1946,7 @@ const bool option_norm[OPT_MAX] = TRUE, /* OPT_run_use_corners */ TRUE, /* OPT_disturb_move */ TRUE, /* OPT_disturb_near */ - TRUE, /* OPT_disturb_panel */ + TRUE, /* OPT_disturb_detect */ TRUE, /* OPT_disturb_state */ TRUE, /* OPT_disturb_minor */ FALSE, /* xxx disturb_other */ @@ -2222,7 +2222,7 @@ const byte option_page[OPT_PAGE_MAX][OPT OPT_run_use_corners, OPT_disturb_move, OPT_disturb_near, - OPT_disturb_panel, + OPT_disturb_detect, OPT_disturb_state, OPT_disturb_minor, OPT_verify_destroy, diff -u -p -r src-3.0.6/src/variable.c src-dtrap/src/variable.c --- src-3.0.6/src/variable.c 2005-03-05 09:50:56.000000000 +0000 +++ src-dtrap/src/variable.c 2006-01-30 16:30:03.000000000 +0000 @@ -396,10 +396,11 @@ byte *temp_x; /* * Array[DUNGEON_HGT][256] of cave grid info flags (padded) * - * This array is padded to a width of 256 to allow fast access to elements + * These arrays are padded to a width of 256 to allow fast access to elements * in the array via "grid" values (see the GRID() macros). */ byte (*cave_info)[256]; +byte (*cave_info2)[256]; /* * Array[DUNGEON_HGT][DUNGEON_WID] of cave grid feature codes diff -u -p -r src-3.0.6/src/xtra1.c src-dtrap/src/xtra1.c --- src-3.0.6/src/xtra1.c 2004-06-25 18:14:35.000000000 +0100 +++ src-dtrap/src/xtra1.c 2006-01-30 17:39:51.000000000 +0000 @@ -625,6 +625,31 @@ static void prt_state(int row, int col) /* + * Prints trap detection status + * + * One could use another p_ptr flag to divorce this function from + * cave_info[][], with codes to update it properly in some places. + * I can't decide which is better. -- pelpel + */ +static void prt_dtrap(int row, int col) +{ + byte info = cave_info2[p_ptr->py][p_ptr->px]; + + /* The player is in a trap-detected grid */ + if (info & (CAVE2_DTRAP)) + { + c_put_str(TERM_GREEN, "DTrap", row, col); + } + + /* Not in a trap-detected grid */ + else + { + put_str(" ", row, col); + } +} + + +/* * Prints the speed of a character. -CJS- */ static void prt_speed(int row, int col) @@ -652,7 +677,7 @@ static void prt_speed(int row, int col) } /* Display the speed */ - c_put_str(attr, format("%-14s", buf), row, col); + c_put_str(attr, format("%-10s", buf), row, col); } @@ -1154,6 +1179,9 @@ static void prt_status_line(void) /* State */ prt_state(row, COL_STATE); + /* Trap detection */ + prt_dtrap(row, COL_DTRAP); + /* Speed */ prt_speed(row, COL_SPEED); @@ -3091,6 +3119,12 @@ void redraw_stuff(void) prt_state(ROW_STATE, COL_STATE); } + if (p_ptr->redraw & (PR_DTRAP)) + { + p_ptr->redraw &= ~(PR_DTRAP); + prt_dtrap(ROW_DTRAP, COL_DTRAP); + } + if (p_ptr->redraw & (PR_SPEED)) { p_ptr->redraw &= ~(PR_SPEED);