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

Comparing deliantra/server/server/c_range.C (file contents):
Revision 1.9 by root, Thu Sep 14 23:13:49 2006 UTC vs.
Revision 1.18 by root, Tue Apr 24 12:32:16 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * CrossFire, A Multiplayer game
3 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (C) 1992 Frank Tore Johansen
6 7 *
7 This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version. 11 * (at your option) any later version.
11 12 *
12 This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 16 * GNU General Public License for more details.
16 17 *
17 You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 21 *
21 The authors can be reached via e-mail at <crossfire@schmorp.de> 22 * The authors can be reached via e-mail at <crossfire@schmorp.de>
22*/ 23 */
23 24
24/* This file deals with range related commands (casting, shooting, 25/* This file deals with range related commands (casting, shooting,
25 * throwing, etc. 26 * throwing, etc.
26 */ 27 */
27 28
28#include <global.h> 29#include <global.h>
29#ifndef __CEXTRACT__
30# include <sproto.h> 30#include <sproto.h>
31#endif
32#include <spells.h> 31#include <spells.h>
33#include <skills.h> 32#include <skills.h>
34#include <newclient.h>
35#include <commands.h> 33#include <commands.h>
36 34
37int 35int
38command_invoke (object *op, char *params) 36command_invoke (object *op, char *params)
39{ 37{
104 /* Note in the code below that we make some 102 /* Note in the code below that we make some
105 * presumptions that there will be a colon in the 103 * presumptions that there will be a colon in the
106 * string. given the code above, this is always 104 * string. given the code above, this is always
107 * the case. 105 * the case.
108 */ 106 */
109 qsort (spell_sort, num_found, MAX_BUF, (int (*)(const void *, const void *)) strcmp); 107 qsort (spell_sort, num_found, MAX_BUF, (int (*)(const void *, const void *)) std::strcmp);
110 strcpy (tmp, "asdfg"); /* Dummy string so initial compare fails */ 108 strcpy (tmp, "asdfg"); /* Dummy string so initial compare fails */
111 for (i = 0; i < num_found; i++) 109 for (i = 0; i < num_found; i++)
112 { 110 {
113 /* Different skill name, so print banner */ 111 /* Different skill name, so print banner */
114 if (strncmp (tmp, spell_sort[i], strlen (tmp))) 112 if (strncmp (tmp, spell_sort[i], strlen (tmp)))
138 136
139 if (command == 'i') 137 if (command == 'i')
140 castnow = 1; 138 castnow = 1;
141 139
142 /* Remove control of the golem */ 140 /* Remove control of the golem */
143 if (op->contr->ranges[range_golem] != NULL)
144 {
145 if (op->contr->golem_count == op->contr->ranges[range_golem]->count)
146 {
147 remove_friendly_object (op->contr->ranges[range_golem]);
148 remove_ob (op->contr->ranges[range_golem]);
149 free_object (op->contr->ranges[range_golem]); 141 if (object *golem = op->contr->ranges[range_golem])
150 } 142 golem->destroy ();
151 143
152 op->contr->ranges[range_golem] = NULL;
153 op->contr->golem_count = 0;
154 }
155
156 if (params != NULL) 144 if (params)
157 { 145 {
158 int spellnumber = 0; 146 int spellnumber = 0;
159 147
160 if ((spellnumber = atoi (params))) 148 if ((spellnumber = atoi (params)))
161 for (spob = op->inv; spob && spob->count != spellnumber; spob = spob->below) 149 for (spob = op->inv; spob && spob->count != spellnumber; spob = spob->below)
228 */ 216 */
229 217
230int 218int
231legal_range (object *op, int r) 219legal_range (object *op, int r)
232{ 220{
233
234 switch (r) 221 switch (r)
235 { 222 {
236 case range_none: /* "Nothing" is always legal */ 223 case range_none: /* "Nothing" is always legal */
237 return 1; 224 return 1;
225
238 case range_bow: 226 case range_bow:
239 case range_misc: 227 case range_misc:
240 case range_magic: /* cast spells */ 228 case range_magic: /* cast spells */
241 if (op->contr->ranges[r]) 229 return !!op->contr->ranges[r];
242 return 1;
243 else
244 return 0;
245 230
246 case range_golem: /* Use scrolls */ 231 case range_golem: /* Use scrolls */
247 if (op->contr->ranges[range_golem] && op->contr->ranges[range_golem]->count == op->contr->golem_count) 232 return !!op->contr->ranges[range_golem];
248 return 1;
249 else
250 return 0;
251 233
252 case range_skill: 234 case range_skill:
253 if (op->chosen_skill) 235 return !!op->chosen_skill;
254 return 1;
255 else
256 return 0;
257 } 236 }
237
258 /* No match above, must not be valid */ 238 /* No match above, must not be valid */
259 return 0; 239 return 0;
260} 240}
261 241
262void 242void
263change_spell (object *op, char k) 243change_spell (object *op, char k)
264{ 244{
265
266 do 245 do
267 { 246 {
268 op->contr->shoottype = (rangetype) (op->contr->shoottype + ((k == '+') ? 1 : -1)); 247 op->contr->shoottype = (rangetype) (op->contr->shoottype + ((k == '+') ? 1 : -1));
269 if (op->contr->shoottype >= range_size) 248 if (op->contr->shoottype >= range_size)
270 op->contr->shoottype = range_none; 249 op->contr->shoottype = range_none;
271 else if (op->contr->shoottype <= range_bottom) 250 else if (op->contr->shoottype <= range_bottom)
272 op->contr->shoottype = (rangetype) (range_size - 1); 251 op->contr->shoottype = (rangetype) (range_size - 1);
273 } 252 }
274 while (!legal_range (op, op->contr->shoottype)); 253 while (!legal_range (op, op->contr->shoottype));
275 254
276 /* Legal range has already checked that we have an appropriate item 255 /* Legal range has already checked that we have an appropriate item
277 * that uses the slot, so we don't need to be too careful about 256 * that uses the slot, so we don't need to be too careful about
278 * checking the status of the object. 257 * checking the status of the object.
279 */ 258 */
280 switch (op->contr->shoottype) 259 switch (op->contr->shoottype)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines