ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/monster.C
Revision: 1.19
Committed: Sun Jul 1 05:00:19 2007 UTC (16 years, 11 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_2, rel-2_3
Changes since 1.18: +14 -15 lines
Log Message:
- upgrade crossfire trt to the GPL version 3 (hopefully correctly).
- add a single file covered by the GNU Affero General Public License
  (which is not yet released, so I used the current draft, which is
  legally a bit wavy, but its likely better than nothing as it expresses
  direct intent by the authors, and we can upgrade as soon as it has been
  released).
  * this should ensure availability of source code for the server at least
    and hopefully also archetypes and maps even when modified versions
    are not being distributed, in accordance of section 13 of the agplv3.

File Contents

# Content
1 /*
2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 *
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
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 *
21 * The authors can be reached via e-mail to <crossfire@schmorp.de>
22 */
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 handling. */
30
31 void
32 insert_multisquare_ob_in_map (object *new_obj, maptile *map)
33 {
34 int x, y;
35 object *old_seg;
36 object *head;
37
38 /* first insert the head */
39 insert_ob_in_map (new_obj, map, new_obj, INS_NO_MERGE | INS_NO_WALK_ON);
40
41 x = new_obj->x;
42 y = new_obj->y;
43 old_seg = new_obj;
44 head = new_obj;
45
46 //TODO: use expand_tail + insert instead
47 for (archetype *at = (archetype *)new_obj->arch->more; at; at = (archetype *)at->more)
48 {
49 object *new_seg;
50
51 new_seg = arch_to_object (at);
52 new_seg->x = x + at->x;
53 new_seg->y = y + at->y;
54 new_seg->map = old_seg->map;
55 insert_ob_in_map (new_seg, new_seg->map, new_seg, INS_NO_MERGE | INS_NO_WALK_ON);
56 new_seg->head = head;
57 old_seg->more = new_seg;
58 old_seg = new_seg;
59 }
60
61 old_seg->more = 0;
62 }
63
64 /* place some monsters into the map. */
65 void
66 place_monsters (maptile *map, char *monsterstyle, int difficulty, random_map_params *RP)
67 {
68 char styledirname[1024];
69 maptile *style_map = 0;
70 int failed_placements;
71 sint64 exp_per_sq, total_experience;
72 int number_monsters = 0;
73 archetype *at;
74
75 sprintf (styledirname, "%s", "/styles/monsterstyles");
76 style_map = find_style (styledirname, monsterstyle, difficulty);
77 if (!style_map)
78 return;
79
80 /* fill up the map with random monsters from the monster style */
81
82 total_experience = 0;
83 failed_placements = 0;
84 exp_per_sq = 0;
85 while (exp_per_sq <= level_exp (difficulty, 1.0) && failed_placements < 100 && number_monsters < (RP->Xsize * RP->Ysize) / 8)
86 {
87 object *this_monster = style_map->pick_random_object ();
88 int x, y, freeindex;
89
90 if (this_monster == NULL)
91 return; /* no monster?? */
92
93 x = rndm (RP->Xsize);
94 y = rndm (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
107 if (new_monster->is_alive ())
108 {
109 total_experience += this_monster->stats.exp;
110
111 for (at = new_monster->arch; at; at = (archetype *)at->more)
112 number_monsters++;
113
114 assert (new_monster->stats.hp >= 0);
115 RP->total_map_hp += new_monster->stats.hp; /* a global count */
116 }
117 else
118 failed_placements++;
119 }
120 else
121 failed_placements++;
122
123 exp_per_sq = (sint64) (((double) 1000 * total_experience) / (map->width * map->height + 1));
124 }
125 }