… | |
… | |
110 | void |
110 | void |
111 | layout::fill_rand (int percent) |
111 | layout::fill_rand (int percent) |
112 | { |
112 | { |
113 | percent = lerp (percent, 0, 100, 0, 256); |
113 | percent = lerp (percent, 0, 100, 0, 256); |
114 | |
114 | |
115 | for (int x = w - 1; --x > 0; ) |
115 | for (int x = 0; x < w; ++x) |
116 | for (int y = h - 1; --y > 0; ) |
116 | for (int y = 0; y < h; ++y) |
117 | data [x][y] = rmg_rndm (256) > percent ? 0 : '#'; |
117 | data [x][y] = rmg_rndm (256) > percent ? 0 : '#'; |
118 | } |
118 | } |
119 | |
119 | |
120 | ///////////////////////////////////////////////////////////////////////////// |
120 | ///////////////////////////////////////////////////////////////////////////// |
121 | |
121 | |
… | |
… | |
701 | |
701 | |
702 | return -1; |
702 | return -1; |
703 | } |
703 | } |
704 | |
704 | |
705 | int |
705 | int |
706 | make_wall (char **maze, int x, int y, int dir) |
706 | make_wall (layout &maze, int x, int y, int dir) |
707 | { |
707 | { |
708 | maze[x][y] = 'D'; /* mark a door */ |
708 | maze[x][y] = 'D'; /* mark a door */ |
709 | |
709 | |
710 | switch (dir) |
710 | switch (dir) |
711 | { |
711 | { |
… | |
… | |
827 | border (); |
827 | border (); |
828 | isolation_remover (0); |
828 | isolation_remover (0); |
829 | } |
829 | } |
830 | |
830 | |
831 | static void |
831 | static void |
832 | gen_mixed_ (layout &maze, random_map_params *RP, int dir) |
832 | gen_mixed_ (layout &maze, random_map_params *RP) |
833 | { |
833 | { |
834 | if (maze.w < 20 && maze.h < 20 && !rmg_rndm (3)) |
834 | if (maze.w > maze.h && maze.w > 16) |
835 | dir = 2; // stop recursion randomly |
|
|
836 | |
|
|
837 | if (dir == 0 && maze.w > 16) |
|
|
838 | { |
835 | { |
839 | int m = rmg_rndm (8, maze.w - 8); |
836 | int m = rmg_rndm (8, maze.w - 8); |
840 | |
837 | |
841 | layout m1 (maze, 0, 0, m , maze.h); gen_mixed_ (m1, RP, !dir); |
838 | layout m1 (maze, 0, 0, m , maze.h); gen_mixed_ (m1, RP); |
842 | layout m2 (maze, m, 0, maze.w, maze.h); gen_mixed_ (m2, RP, !dir); |
839 | layout m2 (maze, m, 0, maze.w, maze.h); gen_mixed_ (m2, RP); |
843 | } |
840 | } |
844 | else if (dir == 1 && maze.h > 16) |
841 | else if (maze.h > 16) |
845 | { |
842 | { |
846 | int m = rmg_rndm (8, maze.h - 8); |
843 | int m = rmg_rndm (8, maze.h - 8); |
847 | |
844 | |
848 | layout m1 (maze, 0, 0, maze.w, m ); gen_mixed_ (m1, RP, !dir); |
845 | layout m1 (maze, 0, 0, maze.w, m ); gen_mixed_ (m1, RP); |
849 | layout m2 (maze, 0, m, maze.w, maze.h); gen_mixed_ (m2, RP, !dir); |
846 | layout m2 (maze, 0, m, maze.w, maze.h); gen_mixed_ (m2, RP); |
850 | } |
847 | } |
851 | else |
848 | else |
852 | { |
849 | { |
853 | RP->map_layout_style = rmg_rndm (NROFLAYOUTS - 2) + 1; |
850 | RP->map_layout_style = rmg_rndm (NROFLAYOUTS - 2) + 1; |
854 | |
851 | |
… | |
… | |
862 | // recursive subdivision with random sublayouts |
859 | // recursive subdivision with random sublayouts |
863 | static void |
860 | static void |
864 | gen_mixed (layout &maze, random_map_params *RP) |
861 | gen_mixed (layout &maze, random_map_params *RP) |
865 | { |
862 | { |
866 | random_map_params &rp = *new random_map_params (RP); |
863 | random_map_params &rp = *new random_map_params (RP); |
867 | gen_mixed_ (maze, &rp, rmg_rndm (2)); |
864 | gen_mixed_ (maze, &rp); |
868 | delete &rp; |
865 | delete &rp; |
869 | |
866 | |
870 | maze.border (); |
867 | maze.border (); |
871 | maze.isolation_remover (0); |
868 | maze.isolation_remover (0); |
872 | } |
869 | } |