ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/region.C
Revision: 1.51
Committed: Sun Apr 25 11:23:31 2010 UTC (14 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.50: +0 -2 lines
Log Message:
remove protal_x/portal_y capability

File Contents

# Content
1 /*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 *
4 * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2001-2003 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992 Frank Tore Johansen
7 *
8 * Deliantra is free software: you can redistribute it and/or modify it under
9 * the terms of the Affero GNU General Public License as published by the
10 * Free Software Foundation, either version 3 of the License, or (at your
11 * 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 Affero GNU General Public License
19 * and the GNU General Public License along with this program. If not, see
20 * <http://www.gnu.org/licenses/>.
21 *
22 * The authors can be reached via e-mail to <support@deliantra.net>
23 */
24
25 #include <global.h>
26 #include <unistd.h>
27
28 regionvec regions;
29
30 region *
31 region::default_region ()
32 {
33 for_all_regions (rgn)
34 if (rgn->fallback)
35 return rgn;
36
37 return regions [0];
38 }
39
40 region *
41 region::find (shstr_cmp name)
42 {
43 for_all_regions (rgn)
44 if (rgn->name == name)
45 return rgn;
46
47 return default_region ();
48 }
49
50 region *
51 region::find (object_thawer &f)
52 {
53 shstr_cmp name = f.get_str ();
54
55 for_all_regions (rgn)
56 if (rgn->name == name)
57 return rgn;
58
59 f.parse_error (format ("region called %s requested, but not found, using fallback.\n", f.get_str ()));
60
61 return default_region ();
62 }
63
64 void
65 region::do_destroy ()
66 {
67 regions.erase (this);
68
69 attachable::do_destroy ();
70
71 refcnt_dec ();
72 }
73
74 //+GPL
75
76 /*
77 * returns 1 if the player is in the region reg, or a child region thereof
78 * otherwise returns 0
79 * if passed a NULL region returns -1
80 */
81 static int
82 region_is_child_of_region (const region * child, const region * r)
83 {
84 if (!r)
85 return -1;
86
87 if (!child)
88 return 0;
89
90 if (child->name == r->name)
91 return 1;
92
93 if (child->parent)
94 return region_is_child_of_region (child->parent, r);
95
96 return 0;
97 }
98
99 /** Returns an object which is an exit through which the player represented by op should be
100 * sent in order to be imprisoned. If there is no suitable place to which an exit can be
101 * constructed, then NULL will be returned. The caller is responsible for freeing the object
102 * created by this function.
103 */
104 object *
105 get_jail_exit (object *op)
106 {
107 if (op->type != PLAYER)
108 {
109 LOG (llevError, "region.c: get_jail_exit called against non-player object.\n");
110 return NULL;
111 }
112
113 region *reg = op->region ();
114 while (reg)
115 {
116 if (reg->jailmap)
117 {
118 object *exit = object::create ();
119 EXIT_PATH (exit) = reg->jailmap;
120 /* damned exits reset savebed and remove teleports, so the prisoner can't escape */
121 exit->set_flag (FLAG_DAMNED);
122 EXIT_X (exit) = reg->jailx;
123 EXIT_Y (exit) = reg->jaily;
124 return exit;
125 }
126 else
127 reg = reg->parent;
128 }
129
130 LOG (llevError, "No suitable jailmap for region %s was found.\n", &reg->name);
131
132 return 0;
133 }
134
135 //-GPL
136
137 region *
138 region::read (object_thawer &f)
139 {
140 assert (f.kw == KW_region);
141
142 region *rgn = new region;
143 rgn->refcnt_inc ();
144
145 f.get (rgn->name);
146 f.next ();
147
148 for (;;)
149 {
150 switch (f.kw)
151 {
152 case KW_parent:
153 rgn->parent = region::find (f);
154 break;
155
156 case KW_msg: f.get_ml (KW_endmsg, rgn->msg); break;
157 case KW_longname: f.get (rgn->longname); break;
158 case KW_jail_map: f.get (rgn->jailmap); break;
159 case KW_jail_x: f.get (rgn->jailx); break;
160 case KW_jail_y: f.get (rgn->jaily); break;
161 case KW_portal_map: f.get (rgn->portalmap);break;
162 case KW_fallback: f.get (rgn->fallback); break;
163 case KW_chance: f.get (rgn->treasure_density); break;
164
165 case KW_randomitems:
166 rgn->treasure = treasurelist::get (f.get_str ());
167 break;
168
169 case KW_end:
170 f.next ();
171
172 // cannot use find as that will request the default region
173 for_all_regions (old)
174 if (old->name == rgn->name)
175 {
176 old->destroy ();
177 break;
178 }
179
180 // just append
181 regions.push_back (rgn);
182 return rgn;
183
184 case KW_ERROR:
185 rgn->set_key_text (f.kw_str, f.value);
186 //fprintf (stderr, "region addkv(%s,%s)\n", f.kw_str, f.value);//D
187 break;
188
189 default:
190 if (!f.parse_error ("region", rgn->name))
191 {
192 rgn->destroy ();
193 return 0;
194 }
195 break;
196 }
197
198 f.next ();
199 }
200 }
201