ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/random_map.C
(Generate patch)

Comparing deliantra/server/random_maps/random_map.C (file contents):
Revision 1.23 by root, Fri Jan 19 15:38:01 2007 UTC vs.
Revision 1.30 by root, Sun Jul 1 05:00:19 2007 UTC

1/* 1/*
2 * CrossFire, A Multiplayer game for X-windows 2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 * 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5 * Copyright (C) 2001 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * This program is free software; you can redistribute it and/or modify 8 * Crossfire TRT is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version. 11 * (at your option) any later version.
12 * 12 *
13 * This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details. 16 * GNU General Public License for more details.
17 * 17 *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * 20 *
22 * The authors can be reached via e-mail at <crossfire@schmorp.de> 21 * The authors can be reached via e-mail to <crossfire@schmorp.de>
23 */ 22 */
24 23
25#include <time.h> 24#include <time.h>
26#include <stdio.h> 25#include <stdio.h>
27#include <global.h> 26#include <global.h>
29#include <room_gen.h> 28#include <room_gen.h>
30#include <random_map.h> 29#include <random_map.h>
31#include <rproto.h> 30#include <rproto.h>
32#include <sproto.h> 31#include <sproto.h>
33 32
34#define CEDE coroapi::cede (); rndm.seed (RP->random_seed + __LINE__); 33#define CEDE coroapi::cede_to_tick (); rndm.seed (RP->random_seed + __LINE__);
35 34
36void 35void
37dump_layout (char **layout, random_map_params *RP) 36dump_layout (char **layout, random_map_params *RP)
38{ 37{
39 { 38 {
59maptile::generate_random_map (random_map_params *RP) 58maptile::generate_random_map (random_map_params *RP)
60{ 59{
61 char **layout, buf[16384]; 60 char **layout, buf[16384];
62 int i; 61 int i;
63 62
63 RP->Xsize = RP->xsize;
64 RP->Ysize = RP->ysize;
65
64 /* pick a random seed, or use the one from the input file */ 66 /* pick a random seed, or use the one from the input file */
65 RP->random_seed = RP->random_seed 67 RP->random_seed = RP->random_seed
66 ? RP->random_seed + RP->dungeon_level 68 ? RP->random_seed + RP->dungeon_level
67 : time (0); 69 : time (0);
68 CEDE; 70 CEDE;
87 89
88 if (RP->Ysize < MIN_RANDOM_MAP_SIZE) 90 if (RP->Ysize < MIN_RANDOM_MAP_SIZE)
89 RP->Ysize = MIN_RANDOM_MAP_SIZE + rndm (25) + 5; 91 RP->Ysize = MIN_RANDOM_MAP_SIZE + rndm (25) + 5;
90 92
91 if (RP->symmetry == SYMMETRY_RANDOM) 93 if (RP->symmetry == SYMMETRY_RANDOM)
92 RP->symmetry_used = (RANDOM () % (SYMMETRY_XY)) + 1; 94 RP->symmetry_used = rndm (SYMMETRY_XY) + 1;
93 else 95 else
94 RP->symmetry_used = RP->symmetry; 96 RP->symmetry_used = RP->symmetry;
95 97
96 if (RP->symmetry_used == SYMMETRY_Y || RP->symmetry_used == SYMMETRY_XY) 98 if (RP->symmetry_used == SYMMETRY_Y || RP->symmetry_used == SYMMETRY_XY)
97 RP->Ysize = RP->Ysize / 2 + 1; 99 RP->Ysize = RP->Ysize / 2 + 1;
100
98 if (RP->symmetry_used == SYMMETRY_X || RP->symmetry_used == SYMMETRY_XY) 101 if (RP->symmetry_used == SYMMETRY_X || RP->symmetry_used == SYMMETRY_XY)
99 RP->Xsize = RP->Xsize / 2 + 1; 102 RP->Xsize = RP->Xsize / 2 + 1;
100 103
101 if (RP->expand2x > 0) 104 if (RP->expand2x > 0)
102 { 105 {
129 if (strstr (RP->layoutstyle, "squarespiral")) 132 if (strstr (RP->layoutstyle, "squarespiral"))
130 RP->map_layout_style = LAYOUT_SQUARE_SPIRAL; 133 RP->map_layout_style = LAYOUT_SQUARE_SPIRAL;
131 134
132 /* No style found - choose one randomly */ 135 /* No style found - choose one randomly */
133 if (RP->map_layout_style == LAYOUT_NONE) 136 if (RP->map_layout_style == LAYOUT_NONE)
134 RP->map_layout_style = (RANDOM () % (NROFLAYOUTS - 1)) + 1; 137 RP->map_layout_style = rndm (NROFLAYOUTS - 1) + 1;
135 138
136 layout = layoutgen (RP); 139 layout = layoutgen (RP);
137 140
138#ifdef RMAP_DEBUG 141#ifdef RMAP_DEBUG
139 dump_layout (layout, RP); 142 dump_layout (layout, RP);
152 155
153 /* allocate the map and set the floor */ 156 /* allocate the map and set the floor */
154 make_map_floor (layout, RP->floorstyle, RP); 157 make_map_floor (layout, RP->floorstyle, RP);
155 158
156 /* set region */ 159 /* set region */
157 region = RP->region; 160 default_region = RP->region;
158 161
159 CEDE; 162 CEDE;
160 163
161 /* create walls unless the wallstyle is "none" */ 164 /* create walls unless the wallstyle is "none" */
162 if (strcmp (RP->wallstyle, "none")) 165 if (strcmp (RP->wallstyle, "none"))
446 for (ti = 0; ti < tries; ti++) 449 for (ti = 0; ti < tries; ti++)
447 { 450 {
448 int dx, dy; /* starting location for looking at creating a door */ 451 int dx, dy; /* starting location for looking at creating a door */
449 int cx, cy; /* results of checking on creating walls. */ 452 int cx, cy; /* results of checking on creating walls. */
450 453
451 dx = RANDOM () % RP->Xsize; 454 dx = rndm (RP->Xsize);
452 dy = RANDOM () % RP->Ysize; 455 dy = rndm (RP->Ysize);
456
453 cx = can_make_wall (maze, dx, dy, 0, RP); /* horizontal */ 457 cx = can_make_wall (maze, dx, dy, 0, RP); /* horizontal */
454 cy = can_make_wall (maze, dx, dy, 1, RP); /* vertical */ 458 cy = can_make_wall (maze, dx, dy, 1, RP); /* vertical */
455 if (cx == -1) 459 if (cx == -1)
456 { 460 {
457 if (cy != -1) 461 if (cy != -1)
458 make_wall (maze, dx, dy, 1); 462 make_wall (maze, dx, dy, 1);
463
459 continue; 464 continue;
460 } 465 }
466
461 if (cy == -1) 467 if (cy == -1)
462 { 468 {
463 make_wall (maze, dx, dy, 0); 469 make_wall (maze, dx, dy, 0);
464 continue; 470 continue;
465 } 471 }
472
466 if (cx < cy) 473 if (cx < cy)
467 make_wall (maze, dx, dy, 0); 474 make_wall (maze, dx, dy, 0);
468 else 475 else
469 make_wall (maze, dx, dy, 1); 476 make_wall (maze, dx, dy, 1);
470 } 477 }
616 while (ndoors > 0 && doorlocs > 0) 623 while (ndoors > 0 && doorlocs > 0)
617 { 624 {
618 int di; 625 int di;
619 int sindex; 626 int sindex;
620 627
621 di = RANDOM () % doorlocs; 628 di = rndm (doorlocs);
622 i = doorlist_x[di]; 629 i = doorlist_x[di];
623 j = doorlist_y[di]; 630 j = doorlist_y[di];
624 sindex = surround_flag (maze, i, j, RP); 631 sindex = surround_flag (maze, i, j, RP);
632
625 if (sindex == 3 || sindex == 12) /* these are possible door sindex */ 633 if (sindex == 3 || sindex == 12) /* these are possible door sindex */
626 { 634 {
627 maze[i][j] = 'D'; 635 maze[i][j] = 'D';
628 ndoors--; 636 ndoors--;
629 } 637 }
638
630 /* reduce the size of the list */ 639 /* reduce the size of the list */
631 doorlocs--; 640 doorlocs--;
632 doorlist_x[di] = doorlist_x[doorlocs]; 641 doorlist_x[di] = doorlist_x[doorlocs];
633 doorlist_y[di] = doorlist_y[doorlocs]; 642 doorlist_y[di] = doorlist_y[doorlocs];
634 } 643 }
640void 649void
641write_map_parameters_to_string (char *buf, random_map_params *RP) 650write_map_parameters_to_string (char *buf, random_map_params *RP)
642{ 651{
643 char small_buf[16384]; 652 char small_buf[16384];
644 653
645 sprintf (buf, "xsize %d\nysize %d\n", RP->Xsize, RP->Ysize); 654 sprintf (buf, "xsize %d\nysize %d\n", RP->xsize, RP->ysize);
646 655
647 if (RP->wallstyle[0]) 656 if (RP->wallstyle[0])
648 { 657 {
649 sprintf (small_buf, "wallstyle %s\n", RP->wallstyle); 658 sprintf (small_buf, "wallstyle %s\n", RP->wallstyle);
650 strcat (buf, small_buf); 659 strcat (buf, small_buf);
791 strcat (buf, small_buf); 800 strcat (buf, small_buf);
792 } 801 }
793 802
794 if (RP->random_seed) 803 if (RP->random_seed)
795 { 804 {
796 sprintf (small_buf, "random_seed %d\n", RP->random_seed); 805 sprintf (small_buf, "random_seed %u\n", RP->random_seed);
797 strcat (buf, small_buf); 806 strcat (buf, small_buf);
798 } 807 }
799 808
800 if (RP->custom) 809 if (RP->custom)
801 { 810 {
806 815
807void 816void
808write_parameters_to_string (char *buf, 817write_parameters_to_string (char *buf,
809 int xsize_n, 818 int xsize_n,
810 int ysize_n, 819 int ysize_n,
811 char *wallstyle_n, 820 const char *wallstyle_n,
812 char *floorstyle_n, 821 const char *floorstyle_n,
813 char *monsterstyle_n, 822 const char *monsterstyle_n,
814 char *treasurestyle_n, 823 const char *treasurestyle_n,
815 char *layoutstyle_n, 824 const char *layoutstyle_n,
816 char *decorstyle_n, 825 const char *decorstyle_n,
817 char *doorstyle_n, 826 const char *doorstyle_n,
818 char *exitstyle_n, 827 const char *exitstyle_n,
819 char *final_map_n, 828 const char *final_map_n,
820 char *exit_on_final_map_n, 829 const char *exit_on_final_map_n,
821 char *this_map_n, 830 const char *this_map_n,
822 int layoutoptions1_n, 831 int layoutoptions1_n,
823 int layoutoptions2_n, 832 int layoutoptions2_n,
824 int layoutoptions3_n, 833 int layoutoptions3_n,
825 int symmetry_n, 834 int symmetry_n,
826 int dungeon_depth_n, 835 int dungeon_depth_n,
827 int dungeon_level_n, 836 int dungeon_level_n,
828 int difficulty_n, 837 int difficulty_n,
829 int difficulty_given_n, 838 int difficulty_given_n,
830 int decoroptions_n, 839 int decoroptions_n,
831 int orientation_n, 840 int orientation_n,
832 int origin_x_n, int origin_y_n, int random_seed_n, int treasureoptions_n, float difficulty_increase) 841 int origin_x_n,
842 int origin_y_n,
843 uint32_t random_seed_n,
844 int treasureoptions_n,
845 float difficulty_increase)
833{ 846{
834 char small_buf[16384]; 847 char small_buf[16384];
835 848
836 sprintf (buf, "xsize %d\nysize %d\n", xsize_n, ysize_n); 849 sprintf (buf, "xsize %d\nysize %d\n", xsize_n, ysize_n);
837 850
973 } 986 }
974 987
975 if (random_seed_n) 988 if (random_seed_n)
976 { 989 {
977 /* Add one so that the next map is a bit different */ 990 /* Add one so that the next map is a bit different */
978 sprintf (small_buf, "random_seed %d\n", random_seed_n + 1); 991 sprintf (small_buf, "random_seed %u\n", random_seed_n + 1);
979 strcat (buf, small_buf); 992 strcat (buf, small_buf);
980 } 993 }
981 994
982 if (treasureoptions_n) 995 if (treasureoptions_n)
983 { 996 {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines