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

Comparing deliantra/server/server/attack.C (file contents):
Revision 1.75 by root, Mon Aug 27 05:10:51 2007 UTC vs.
Revision 1.82 by root, Tue Apr 22 07:01:47 2008 UTC

1/* 1/*
2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team 4 * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * Crossfire TRT is free software: you can redistribute it and/or modify 8 * Deliantra is free software: you can redistribute it and/or modify
9 * 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
10 * the Free Software Foundation, either version 3 of the License, or 10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version. 11 * (at your option) any later version.
12 * 12 *
13 * 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,
16 * GNU General Public License for more details. 16 * GNU General Public License for more details.
17 * 17 *
18 * 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
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * 20 *
21 * The authors can be reached via e-mail to <crossfire@schmorp.de> 21 * The authors can be reached via e-mail to <support@deliantra.net>
22 */ 22 */
23 23
24#include <assert.h> 24#include <assert.h>
25#include <global.h> 25#include <global.h>
26#include <living.h> 26#include <living.h>
62 CLEAR_FLAG (op, FLAG_DAMNED); 62 CLEAR_FLAG (op, FLAG_DAMNED);
63 CLEAR_FLAG (op, FLAG_CURSED); 63 CLEAR_FLAG (op, FLAG_CURSED);
64 CLEAR_FLAG (op, FLAG_KNOWN_MAGICAL); 64 CLEAR_FLAG (op, FLAG_KNOWN_MAGICAL);
65 CLEAR_FLAG (op, FLAG_KNOWN_CURSED); 65 CLEAR_FLAG (op, FLAG_KNOWN_CURSED);
66 66
67 if (op->env && op->env->type == PLAYER) 67 if (object *pl = op->visible_to ())
68 esrv_send_item (op->env, op); 68 esrv_update_item (UPD_FLAGS, pl, op);
69 } 69 }
70} 70}
71 71
72/* did_make_save_item just checks to make sure the item actually 72/* did_make_save_item just checks to make sure the item actually
73 * made its saving throw based on the tables. It does not take 73 * made its saving throw based on the tables. It does not take
163 */ 163 */
164 if (type & (AT_FIRE | AT_ELECTRICITY) && op->other_arch && QUERY_FLAG (op, FLAG_IS_LIGHTABLE)) 164 if (type & (AT_FIRE | AT_ELECTRICITY) && op->other_arch && QUERY_FLAG (op, FLAG_IS_LIGHTABLE))
165 { 165 {
166 const char *arch = op->other_arch->archname; 166 const char *arch = op->other_arch->archname;
167 167
168 op = decrease_ob_nr (op, 1); 168 if (op->decrease ())
169
170 if (op)
171 fix_stopped_item (op, m, originator); 169 fix_stopped_item (op, m, originator);
172 170
173 if ((op = get_archetype (arch)) != NULL) 171 if ((op = get_archetype (arch)))
174 { 172 {
175 if (env) 173 if (env)
176 { 174 {
177 op->x = env->x, op->y = env->y; 175 op->x = env->x, op->y = env->y; //???? wtf
178 insert_ob_in_ob (op, env); 176 env->insert (op);
179 if (env->contr)
180 esrv_send_item (env, op);
181 } 177 }
182 else 178 else
183 { 179 {
184 op->x = x, op->y = y; 180 op->x = x, op->y = y;
185 insert_ob_in_map (op, m, originator, 0); 181 insert_ob_in_map (op, m, originator, 0);
196 return; 192 return;
197 } 193 }
198 194
199 if (op->nrof > 1) 195 if (op->nrof > 1)
200 { 196 {
201 op = decrease_ob_nr (op, rndm (0, op->nrof - 1)); 197 if (op->decrease (rndm (0, op->nrof - 1)))
202
203 if (op)
204 fix_stopped_item (op, m, originator); 198 fix_stopped_item (op, m, originator);
205 } 199 }
206 else 200 else
207 {
208 if (op->env)
209 {
210 object *tmp = op->in_player ();
211
212 if (tmp)
213 esrv_del_item (tmp->contr, op->count);
214 }
215
216 op->destroy (); 201 op->destroy ();
217 }
218 202
219 if (type & (AT_FIRE | AT_ELECTRICITY)) 203 if (type & (AT_FIRE | AT_ELECTRICITY))
220 if (env) 204 if (env)
221 { 205 {
222 op = get_archetype ("burnout"); 206 op = get_archetype ("burnout");
689 if (QUERY_FLAG (*target, FLAG_FREED) || QUERY_FLAG (*hitter, FLAG_FREED)) 673 if (QUERY_FLAG (*target, FLAG_FREED) || QUERY_FLAG (*hitter, FLAG_FREED))
690 { 674 {
691 LOG (llevError, "BUG: get_attack_mode(): freed object\n"); 675 LOG (llevError, "BUG: get_attack_mode(): freed object\n");
692 return 1; 676 return 1;
693 } 677 }
678
694 if ((*target)->head) 679 if ((*target)->head)
695 *target = (*target)->head; 680 *target = (*target)->head;
681
696 if ((*hitter)->head) 682 if ((*hitter)->head)
697 *hitter = (*hitter)->head; 683 *hitter = (*hitter)->head;
684
698 if ((*hitter)->env != NULL || (*target)->env != NULL) 685 if ((*hitter)->env != NULL || (*target)->env != NULL)
699 { 686 {
700 *simple_attack = 1; 687 *simple_attack = 1;
701 return 0; 688 return 0;
702 } 689 }
690
703 if (QUERY_FLAG (*target, FLAG_REMOVED) 691 if (QUERY_FLAG (*target, FLAG_REMOVED)
704 || QUERY_FLAG (*hitter, FLAG_REMOVED) || (*hitter)->map == NULL || !on_same_map ((*hitter), (*target))) 692 || QUERY_FLAG (*hitter, FLAG_REMOVED)
693 || !(*hitter)->map
694 || !on_same_map (*hitter, *target))
705 { 695 {
706 LOG (llevError, "BUG: hitter (arch %s, name %s) with no relation to " "target\n", &(*hitter)->arch->archname, &(*hitter)->name); 696 LOG (llevError | logBacktrace, "BUG: hitter (%s) with no relation to target (%s)\n",
697 (*hitter)->debug_desc (), (*target)->debug_desc ());
707 return 1; 698 return 1;
708 } 699 }
700
709 *simple_attack = 0; 701 *simple_attack = 0;
710 return 0; 702 return 0;
711} 703}
712 704
713static int 705static int
877 * debate - 5000 is 5 kg, so arrows, knives, and other light weapons 869 * debate - 5000 is 5 kg, so arrows, knives, and other light weapons
878 * stick around. 870 * stick around.
879 */ 871 */
880 if (op->weight <= 5000 && tmp->stats.hp >= 0) 872 if (op->weight <= 5000 && tmp->stats.hp >= 0)
881 { 873 {
882 tmp = tmp->head_ (); 874 tmp->head_ ()->insert (op);
883
884 op->remove ();
885 op = insert_ob_in_ob (op, tmp);
886
887 if (tmp->type == PLAYER)
888 esrv_send_item (tmp, op);
889
890 return 1; 875 return 1;
891 } 876 }
892 else 877 else
893 return 0; 878 return 0;
894} 879}
1208 1193
1209 /* High damage acid has better chance of corroding 1194 /* High damage acid has better chance of corroding
1210 objects */ 1195 objects */
1211 if (rndm (0, dam + 4) > random_roll (0, 39, op, PREFER_HIGH) + 2 * tmp->magic) 1196 if (rndm (0, dam + 4) > random_roll (0, 39, op, PREFER_HIGH) + 2 * tmp->magic)
1212 { 1197 {
1213 if (op->type == PLAYER)
1214 /* Make this more visible */
1215 new_draw_info_format (NDI_UNIQUE | NDI_RED, 0, op,
1216 "The %s's acid corrodes your %s!", query_name (hitter), query_name (tmp));
1217 flag = 1; 1198 flag = 1;
1218 tmp->magic--; 1199 tmp->magic--;
1219 if (op->type == PLAYER) 1200
1220 esrv_send_item (op, tmp); 1201 if (object *pl = tmp->visible_to ())
1202 {
1203 /* Make this more visible */
1204 new_draw_info_format (NDI_UNIQUE | NDI_RED, 0, pl,
1205 "The %s's acid corrodes your %s!", query_name (hitter), query_name (tmp));
1206
1207 esrv_send_item (op, tmp); //TODO: UPD_NAME should be enough (it's enough in other cases)
1208 }
1221 } 1209 }
1222 } 1210 }
1223 1211
1224 if (flag) 1212 if (flag)
1225 op->update_stats (); /* Something was corroded */ 1213 op->update_stats (); /* Something was corroded */
1958 return maxdam; 1946 return maxdam;
1959 } 1947 }
1960 1948
1961 op->remove (); 1949 op->remove ();
1962 1950
1963 for (i = 0; i < NROFNEWOBJS (op); i++) 1951 for (i = 0; i < op->stats.food; i++)
1964 { /* This doesn't handle op->more yet */ 1952 { /* This doesn't handle op->more yet */
1965 object *tmp = arch_to_object (op->other_arch); 1953 object *tmp = arch_to_object (op->other_arch);
1966 int j; 1954 int j;
1967 1955
1968 tmp->stats.hp = op->stats.hp; 1956 tmp->stats.hp = op->stats.hp;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines