ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/monster.c
Revision: 1.2
Committed: Sun Aug 13 17:16:03 2006 UTC (17 years, 9 months ago) by elmex
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +1 -1 lines
State: FILE REMOVED
Log Message:
Made server compile with C++.
Removed cfanim plugin and crossedit.
C++ here we come.

File Contents

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