Do I really need to patch Nashkel Mines' BMP file or I can do this programmatically?
Yes to both: you can patch a search bitmap programmatically (via WeiDU), but there aren't any handy macros. Basically, you want to diff the two files, the original and your change with the new exit, using WinDiff or another such utility. That gives you the differences you can patch, which really shouldn't amount to a whole lot of code. Here is an example of that from the Aurora's Shoes code. The first block patches the area (.are) file itself to add a travel area, an entrance, and an animation for a new interior subarea. The second block patches the search bitmap so that the party can approach the entrance that was otherwise in impassable terrain. The relevant code amounts to only 10 lines.
COPY_EXISTING ~%nnsh%.are~ override //North Nashkel Road entrance
PATCH_IF SOURCE_SIZE > 0x28f BEGIN
LPF fj_add_are_structure
INT_VAR
fj_type = 2 //travel
fj_box_left = 3602
fj_box_top = 627
fj_box_right = 3674
fj_box_bottom = 721
fj_cursor_index = 30 //door
fj_vertex_0 = 3602 + (703 << 16)
fj_vertex_1 = 3674 + (721 << 16)
fj_vertex_2 = 3674 + (643 << 16)
fj_vertex_3 = 3616 + (627 << 16)
STR_VAR
fj_structure_type = region
fj_name = Door4301
fj_destination_area = ag4301
fj_destination_name = Exit4300
END
LPF fj_add_are_structure
INT_VAR
fj_loc_x = 3690
fj_loc_y = 764
fj_orientation = 1 //SSW
STR_VAR
fj_structure_type = entrance
fj_name = Exit4301
RET
some_unknown_offset = fj_return_offset
END
WRITE_SHORT some_unknown_offset + 0x28 64
LPF fj_add_are_structure
INT_VAR
fj_loc_x = 3609
fj_loc_y = 674
fj_flags = 0b00000000000000000001000110000101
//visible, not illuminated, invisible in dark, covered by actors, shown in combat
STR_VAR
fj_structure_type = animation
fj_name = Cave1
fj_bam_resref = ag4300c1
END
END
BUT_ONLY
COPY_EXISTING ~%nnsh%sr.bmp~ ~override~ //Search map
PATCH_IF SOURCE_SIZE > 0xa5e8 BEGIN
WRITE_BYTE 0xa2c7 0x1f
WRITE_SHORT 0xa367 0x1111
WRITE_BYTE 0xa369 0x18
WRITE_SHORT 0xa407 0x1111
WRITE_BYTE 0xa409 0x18
WRITE_SHORT 0xa4a7 0x1111
WRITE_BYTE 0xa4a9 0x18
WRITE_SHORT 0xa547 0x1111
WRITE_BYTE 0xa549 0x18
WRITE_SHORT 0xa5e7 0x1181
END
BUT_ONLY