… | |
… | |
29 | #include <room_gen.h> |
29 | #include <room_gen.h> |
30 | #include <random_map.h> |
30 | #include <random_map.h> |
31 | #include <rproto.h> |
31 | #include <rproto.h> |
32 | #include <sproto.h> |
32 | #include <sproto.h> |
33 | |
33 | |
34 | #define CEDE coroapi::cede (); rndm.seed (RP->random_seed + __LINE__); |
34 | #define CEDE coroapi::cede_to_tick (); rndm.seed (RP->random_seed + __LINE__); |
35 | |
35 | |
36 | void |
36 | void |
37 | dump_layout (char **layout, random_map_params *RP) |
37 | dump_layout (char **layout, random_map_params *RP) |
38 | { |
38 | { |
39 | { |
39 | { |
… | |
… | |
59 | maptile::generate_random_map (random_map_params *RP) |
59 | maptile::generate_random_map (random_map_params *RP) |
60 | { |
60 | { |
61 | char **layout, buf[16384]; |
61 | char **layout, buf[16384]; |
62 | int i; |
62 | int i; |
63 | |
63 | |
|
|
64 | RP->Xsize = RP->xsize; |
|
|
65 | RP->Ysize = RP->ysize; |
|
|
66 | |
64 | /* pick a random seed, or use the one from the input file */ |
67 | /* pick a random seed, or use the one from the input file */ |
65 | RP->random_seed = RP->random_seed |
68 | RP->random_seed = RP->random_seed |
66 | ? RP->random_seed + RP->dungeon_level |
69 | ? RP->random_seed + RP->dungeon_level |
67 | : time (0); |
70 | : time (0); |
68 | CEDE; |
71 | CEDE; |
… | |
… | |
87 | |
90 | |
88 | if (RP->Ysize < MIN_RANDOM_MAP_SIZE) |
91 | if (RP->Ysize < MIN_RANDOM_MAP_SIZE) |
89 | RP->Ysize = MIN_RANDOM_MAP_SIZE + rndm (25) + 5; |
92 | RP->Ysize = MIN_RANDOM_MAP_SIZE + rndm (25) + 5; |
90 | |
93 | |
91 | if (RP->symmetry == SYMMETRY_RANDOM) |
94 | if (RP->symmetry == SYMMETRY_RANDOM) |
92 | RP->symmetry_used = (RANDOM () % (SYMMETRY_XY)) + 1; |
95 | RP->symmetry_used = rndm (SYMMETRY_XY) + 1; |
93 | else |
96 | else |
94 | RP->symmetry_used = RP->symmetry; |
97 | RP->symmetry_used = RP->symmetry; |
95 | |
98 | |
96 | if (RP->symmetry_used == SYMMETRY_Y || RP->symmetry_used == SYMMETRY_XY) |
99 | if (RP->symmetry_used == SYMMETRY_Y || RP->symmetry_used == SYMMETRY_XY) |
97 | RP->Ysize = RP->Ysize / 2 + 1; |
100 | RP->Ysize = RP->Ysize / 2 + 1; |
|
|
101 | |
98 | if (RP->symmetry_used == SYMMETRY_X || RP->symmetry_used == SYMMETRY_XY) |
102 | if (RP->symmetry_used == SYMMETRY_X || RP->symmetry_used == SYMMETRY_XY) |
99 | RP->Xsize = RP->Xsize / 2 + 1; |
103 | RP->Xsize = RP->Xsize / 2 + 1; |
100 | |
104 | |
101 | if (RP->expand2x > 0) |
105 | if (RP->expand2x > 0) |
102 | { |
106 | { |
… | |
… | |
129 | if (strstr (RP->layoutstyle, "squarespiral")) |
133 | if (strstr (RP->layoutstyle, "squarespiral")) |
130 | RP->map_layout_style = LAYOUT_SQUARE_SPIRAL; |
134 | RP->map_layout_style = LAYOUT_SQUARE_SPIRAL; |
131 | |
135 | |
132 | /* No style found - choose one randomly */ |
136 | /* No style found - choose one randomly */ |
133 | if (RP->map_layout_style == LAYOUT_NONE) |
137 | if (RP->map_layout_style == LAYOUT_NONE) |
134 | RP->map_layout_style = (RANDOM () % (NROFLAYOUTS - 1)) + 1; |
138 | RP->map_layout_style = rndm (NROFLAYOUTS - 1) + 1; |
135 | |
139 | |
136 | layout = layoutgen (RP); |
140 | layout = layoutgen (RP); |
137 | |
141 | |
138 | #ifdef RMAP_DEBUG |
142 | #ifdef RMAP_DEBUG |
139 | dump_layout (layout, RP); |
143 | dump_layout (layout, RP); |
… | |
… | |
152 | |
156 | |
153 | /* allocate the map and set the floor */ |
157 | /* allocate the map and set the floor */ |
154 | make_map_floor (layout, RP->floorstyle, RP); |
158 | make_map_floor (layout, RP->floorstyle, RP); |
155 | |
159 | |
156 | /* set region */ |
160 | /* set region */ |
157 | region = RP->region; |
161 | default_region = RP->region; |
158 | |
162 | |
159 | CEDE; |
163 | CEDE; |
160 | |
164 | |
161 | /* create walls unless the wallstyle is "none" */ |
165 | /* create walls unless the wallstyle is "none" */ |
162 | if (strcmp (RP->wallstyle, "none")) |
166 | if (strcmp (RP->wallstyle, "none")) |
… | |
… | |
446 | for (ti = 0; ti < tries; ti++) |
450 | for (ti = 0; ti < tries; ti++) |
447 | { |
451 | { |
448 | int dx, dy; /* starting location for looking at creating a door */ |
452 | int dx, dy; /* starting location for looking at creating a door */ |
449 | int cx, cy; /* results of checking on creating walls. */ |
453 | int cx, cy; /* results of checking on creating walls. */ |
450 | |
454 | |
451 | dx = RANDOM () % RP->Xsize; |
455 | dx = rndm (RP->Xsize); |
452 | dy = RANDOM () % RP->Ysize; |
456 | dy = rndm (RP->Ysize); |
|
|
457 | |
453 | cx = can_make_wall (maze, dx, dy, 0, RP); /* horizontal */ |
458 | cx = can_make_wall (maze, dx, dy, 0, RP); /* horizontal */ |
454 | cy = can_make_wall (maze, dx, dy, 1, RP); /* vertical */ |
459 | cy = can_make_wall (maze, dx, dy, 1, RP); /* vertical */ |
455 | if (cx == -1) |
460 | if (cx == -1) |
456 | { |
461 | { |
457 | if (cy != -1) |
462 | if (cy != -1) |
458 | make_wall (maze, dx, dy, 1); |
463 | make_wall (maze, dx, dy, 1); |
|
|
464 | |
459 | continue; |
465 | continue; |
460 | } |
466 | } |
|
|
467 | |
461 | if (cy == -1) |
468 | if (cy == -1) |
462 | { |
469 | { |
463 | make_wall (maze, dx, dy, 0); |
470 | make_wall (maze, dx, dy, 0); |
464 | continue; |
471 | continue; |
465 | } |
472 | } |
|
|
473 | |
466 | if (cx < cy) |
474 | if (cx < cy) |
467 | make_wall (maze, dx, dy, 0); |
475 | make_wall (maze, dx, dy, 0); |
468 | else |
476 | else |
469 | make_wall (maze, dx, dy, 1); |
477 | make_wall (maze, dx, dy, 1); |
470 | } |
478 | } |
… | |
… | |
616 | while (ndoors > 0 && doorlocs > 0) |
624 | while (ndoors > 0 && doorlocs > 0) |
617 | { |
625 | { |
618 | int di; |
626 | int di; |
619 | int sindex; |
627 | int sindex; |
620 | |
628 | |
621 | di = RANDOM () % doorlocs; |
629 | di = rndm (doorlocs); |
622 | i = doorlist_x[di]; |
630 | i = doorlist_x[di]; |
623 | j = doorlist_y[di]; |
631 | j = doorlist_y[di]; |
624 | sindex = surround_flag (maze, i, j, RP); |
632 | sindex = surround_flag (maze, i, j, RP); |
|
|
633 | |
625 | if (sindex == 3 || sindex == 12) /* these are possible door sindex */ |
634 | if (sindex == 3 || sindex == 12) /* these are possible door sindex */ |
626 | { |
635 | { |
627 | maze[i][j] = 'D'; |
636 | maze[i][j] = 'D'; |
628 | ndoors--; |
637 | ndoors--; |
629 | } |
638 | } |
|
|
639 | |
630 | /* reduce the size of the list */ |
640 | /* reduce the size of the list */ |
631 | doorlocs--; |
641 | doorlocs--; |
632 | doorlist_x[di] = doorlist_x[doorlocs]; |
642 | doorlist_x[di] = doorlist_x[doorlocs]; |
633 | doorlist_y[di] = doorlist_y[doorlocs]; |
643 | doorlist_y[di] = doorlist_y[doorlocs]; |
634 | } |
644 | } |
… | |
… | |
640 | void |
650 | void |
641 | write_map_parameters_to_string (char *buf, random_map_params *RP) |
651 | write_map_parameters_to_string (char *buf, random_map_params *RP) |
642 | { |
652 | { |
643 | char small_buf[16384]; |
653 | char small_buf[16384]; |
644 | |
654 | |
645 | sprintf (buf, "xsize %d\nysize %d\n", RP->Xsize, RP->Ysize); |
655 | sprintf (buf, "xsize %d\nysize %d\n", RP->xsize, RP->ysize); |
646 | |
656 | |
647 | if (RP->wallstyle[0]) |
657 | if (RP->wallstyle[0]) |
648 | { |
658 | { |
649 | sprintf (small_buf, "wallstyle %s\n", RP->wallstyle); |
659 | sprintf (small_buf, "wallstyle %s\n", RP->wallstyle); |
650 | strcat (buf, small_buf); |
660 | strcat (buf, small_buf); |
… | |
… | |
791 | strcat (buf, small_buf); |
801 | strcat (buf, small_buf); |
792 | } |
802 | } |
793 | |
803 | |
794 | if (RP->random_seed) |
804 | if (RP->random_seed) |
795 | { |
805 | { |
796 | sprintf (small_buf, "random_seed %d\n", RP->random_seed); |
806 | sprintf (small_buf, "random_seed %u\n", RP->random_seed); |
797 | strcat (buf, small_buf); |
807 | strcat (buf, small_buf); |
798 | } |
808 | } |
799 | |
809 | |
800 | if (RP->custom) |
810 | if (RP->custom) |
801 | { |
811 | { |
… | |
… | |
806 | |
816 | |
807 | void |
817 | void |
808 | write_parameters_to_string (char *buf, |
818 | write_parameters_to_string (char *buf, |
809 | int xsize_n, |
819 | int xsize_n, |
810 | int ysize_n, |
820 | int ysize_n, |
811 | char *wallstyle_n, |
821 | const char *wallstyle_n, |
812 | char *floorstyle_n, |
822 | const char *floorstyle_n, |
813 | char *monsterstyle_n, |
823 | const char *monsterstyle_n, |
814 | char *treasurestyle_n, |
824 | const char *treasurestyle_n, |
815 | char *layoutstyle_n, |
825 | const char *layoutstyle_n, |
816 | char *decorstyle_n, |
826 | const char *decorstyle_n, |
817 | char *doorstyle_n, |
827 | const char *doorstyle_n, |
818 | char *exitstyle_n, |
828 | const char *exitstyle_n, |
819 | char *final_map_n, |
829 | const char *final_map_n, |
820 | char *exit_on_final_map_n, |
830 | const char *exit_on_final_map_n, |
821 | char *this_map_n, |
831 | const char *this_map_n, |
822 | int layoutoptions1_n, |
832 | int layoutoptions1_n, |
823 | int layoutoptions2_n, |
833 | int layoutoptions2_n, |
824 | int layoutoptions3_n, |
834 | int layoutoptions3_n, |
825 | int symmetry_n, |
835 | int symmetry_n, |
826 | int dungeon_depth_n, |
836 | int dungeon_depth_n, |
827 | int dungeon_level_n, |
837 | int dungeon_level_n, |
828 | int difficulty_n, |
838 | int difficulty_n, |
829 | int difficulty_given_n, |
839 | int difficulty_given_n, |
830 | int decoroptions_n, |
840 | int decoroptions_n, |
831 | int orientation_n, |
841 | int orientation_n, |
832 | int origin_x_n, int origin_y_n, int random_seed_n, int treasureoptions_n, float difficulty_increase) |
842 | int origin_x_n, |
|
|
843 | int origin_y_n, |
|
|
844 | uint32_t random_seed_n, |
|
|
845 | int treasureoptions_n, |
|
|
846 | float difficulty_increase) |
833 | { |
847 | { |
834 | char small_buf[16384]; |
848 | char small_buf[16384]; |
835 | |
849 | |
836 | sprintf (buf, "xsize %d\nysize %d\n", xsize_n, ysize_n); |
850 | sprintf (buf, "xsize %d\nysize %d\n", xsize_n, ysize_n); |
837 | |
851 | |
… | |
… | |
973 | } |
987 | } |
974 | |
988 | |
975 | if (random_seed_n) |
989 | if (random_seed_n) |
976 | { |
990 | { |
977 | /* Add one so that the next map is a bit different */ |
991 | /* Add one so that the next map is a bit different */ |
978 | sprintf (small_buf, "random_seed %d\n", random_seed_n + 1); |
992 | sprintf (small_buf, "random_seed %u\n", random_seed_n + 1); |
979 | strcat (buf, small_buf); |
993 | strcat (buf, small_buf); |
980 | } |
994 | } |
981 | |
995 | |
982 | if (treasureoptions_n) |
996 | if (treasureoptions_n) |
983 | { |
997 | { |