ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/monster.C
Revision: 1.7
Committed: Sat Dec 30 18:45:28 2006 UTC (17 years, 4 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.6: +1 -1 lines
Log Message:
random maps are nphard

File Contents

# User Rev Content
1 elmex 1.1 /*
2     CrossFire, A Multiplayer game for X-windows
3    
4     Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5     Copyright (C) 1992 Frank Tore Johansen
6    
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11    
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16    
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20    
21 root 1.4 The authors can be reached via e-mail at <crossfire@schmorp.de>
22 elmex 1.1 */
23    
24     #include <global.h>
25     #include <random_map.h>
26     #include <rproto.h>
27    
28     /* some monsters are multisquare, and these guys require special
29 root 1.2 handling. */
30 elmex 1.1
31 root 1.3 void
32 root 1.5 insert_multisquare_ob_in_map (object *new_obj, maptile *map)
33 root 1.3 {
34     int x, y;
35 elmex 1.1 archetype *at;
36     object *old_seg;
37     object *head;
38 root 1.3
39 elmex 1.1 /* first insert the head */
40 root 1.3 insert_ob_in_map (new_obj, map, new_obj, INS_NO_MERGE | INS_NO_WALK_ON);
41 elmex 1.1
42     x = new_obj->x;
43     y = new_obj->y;
44 root 1.3 old_seg = new_obj;
45 elmex 1.1 head = new_obj;
46 root 1.3 for (at = new_obj->arch->more; at != NULL; at = at->more)
47     {
48     object *new_seg;
49    
50     new_seg = arch_to_object (at);
51     new_seg->x = x + at->clone.x;
52     new_seg->y = y + at->clone.y;
53     new_seg->map = old_seg->map;
54     insert_ob_in_map (new_seg, new_seg->map, new_seg, INS_NO_MERGE | INS_NO_WALK_ON);
55     new_seg->head = head;
56     old_seg->more = new_seg;
57     old_seg = new_seg;
58     }
59 elmex 1.1 old_seg->more = NULL;
60    
61    
62     }
63 root 1.3
64 elmex 1.1
65     /* place some monsters into the map. */
66 root 1.3 void
67 root 1.7 place_monsters (maptile *map, char *monsterstyle, int difficulty, random_map_params * RP)
68 root 1.3 {
69 elmex 1.1 char styledirname[256];
70 root 1.5 maptile *style_map = 0;
71 elmex 1.1 int failed_placements;
72     sint64 exp_per_sq, total_experience;
73 root 1.3 int number_monsters = 0;
74 elmex 1.1 archetype *at;
75    
76 root 1.3 sprintf (styledirname, "%s", "/styles/monsterstyles");
77     style_map = find_style (styledirname, monsterstyle, difficulty);
78     if (style_map == 0)
79     return;
80 elmex 1.1
81 root 1.3 /* fill up the map with random monsters from the monster style */
82 elmex 1.1
83     total_experience = 0;
84     failed_placements = 0;
85     exp_per_sq = 0;
86 root 1.3 while (exp_per_sq <= level_exp (difficulty, 1.0) && failed_placements < 100 && number_monsters < (RP->Xsize * RP->Ysize) / 8)
87     {
88     object *this_monster = pick_random_object (style_map);
89     int x, y, freeindex;
90    
91     if (this_monster == NULL)
92     return; /* no monster?? */
93     x = RANDOM () % RP->Xsize;
94     y = RANDOM () % RP->Ysize;
95     freeindex = find_first_free_spot (this_monster, map, x, y);
96     if (freeindex != -1)
97     {
98     object *new_monster = arch_to_object (this_monster->arch);
99    
100     x += freearr_x[freeindex];
101     y += freearr_y[freeindex];
102     copy_object_with_inv (this_monster, new_monster);
103     new_monster->x = x;
104     new_monster->y = y;
105     insert_multisquare_ob_in_map (new_monster, map);
106     total_experience += this_monster->stats.exp;
107     for (at = new_monster->arch; at != NULL; at = at->more)
108     number_monsters++;
109     RP->total_map_hp += new_monster->stats.hp; /* a global count */
110     }
111     else
112     {
113     failed_placements++;
114     }
115 root 1.6 exp_per_sq = (sint64) (((double) 1000 * total_experience) / (map->width * map->height + 1));
116 elmex 1.1 }
117     }