ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/monster.C
Revision: 1.3
Committed: Sun Sep 10 16:06:37 2006 UTC (17 years, 9 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.2: +63 -49 lines
Log Message:
indent

File Contents

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