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

Comparing deliantra/server/random_maps/monster.C (file contents):
Revision 1.2 by root, Tue Aug 29 08:01:36 2006 UTC vs.
Revision 1.5 by root, Sat Sep 16 22:24:12 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines