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

Comparing deliantra/server/server/player.C (file contents):
Revision 1.21 by root, Tue Sep 12 19:20:08 2006 UTC vs.
Revision 1.43 by root, Sat Dec 16 03:08:26 2006 UTC

16 16
17 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 20
21 The author can be reached via e-mail to crossfire-devel@real-time.com 21 The author can be reached via e-mail to <crossfire@schmorp.de>
22*/ 22*/
23 23
24#include <global.h> 24#include <global.h>
25#ifndef WIN32 /* ---win32 remove headers */
26# include <pwd.h> 25#include <pwd.h>
27#endif
28#ifndef __CEXTRACT__
29# include <sproto.h> 26#include <sproto.h>
30#endif
31#include <sounds.h> 27#include <sounds.h>
32#include <living.h> 28#include <living.h>
33#include <object.h> 29#include <object.h>
34#include <spells.h> 30#include <spells.h>
35#include <skills.h> 31#include <skills.h>
36#include <newclient.h>
37 32
38#ifdef COZY_SERVER 33#ifdef COZY_SERVER
39extern int same_party (partylist *a, partylist *b); 34extern int same_party (partylist *a, partylist *b);
40#endif 35#endif
41 36
208 * the one that is passed. 203 * the one that is passed.
209 */ 204 */
210static player * 205static player *
211get_player (player *p) 206get_player (player *p)
212{ 207{
213 object *op = arch_to_object (get_player_archetype (NULL)); 208 object *op = arch_to_object (get_player_archetype (0));
214 int i; 209 int i;
215
216 if (!p)
217 {
218 p = new player;
219
220 /* This adds the player in the linked list. There is extra
221 * complexity here because we want to add the new player at the
222 * end of the list - there is in fact no compelling reason that
223 * that needs to be done except for things like output of
224 * 'who'.
225 */
226 player *tmp = first_player;
227
228 while (tmp != NULL && tmp->next != NULL)
229 tmp = tmp->next;
230 if (tmp != NULL)
231 tmp->next = p;
232 else
233 first_player = p;
234
235 p->next = NULL;
236 }
237 210
238 /* Clears basically the entire player structure except 211 /* Clears basically the entire player structure except
239 * for next and socket. 212 * for next and socket.
240 */ 213 */
241 p->clear (); 214 p->clear ();
260 op->speed_left = 0.5; 233 op->speed_left = 0.5;
261 op->speed = 1.0; 234 op->speed = 1.0;
262 op->direction = 5; /* So player faces south */ 235 op->direction = 5; /* So player faces south */
263 op->stats.wc = 2; 236 op->stats.wc = 2;
264 op->run_away = 25; /* Then we panick... */ 237 op->run_away = 25; /* Then we panick... */
238
239 {
240 int oldmon = p->socket->monitor_spells; // what a hack
265 p->socket.monitor_spells = 0; /* Needed because esrv_update_spells( ) gets called by roll_stats */ 241 p->socket->monitor_spells = 0; /* Needed because esrv_update_spells( ) gets called by roll_stats */
266
267 roll_stats (op); 242 roll_stats (op);
243 p->socket->monitor_spells = oldmon;
244 }
268 p->state = ST_ROLL_STAT; 245 p->state = ST_ROLL_STAT;
269 clear_los (op); 246 clear_los (op);
270 247
271 p->gen_sp_armour = 10; 248 p->gen_sp_armour = 10;
272 p->last_speed = -1; 249 p->last_speed = -1;
294 for (i = 0; i < NUM_SKILLS; i++) 271 for (i = 0; i < NUM_SKILLS; i++)
295 { 272 {
296 p->last_skill_exp[i] = -1; 273 p->last_skill_exp[i] = -1;
297 p->last_skill_ob[i] = NULL; 274 p->last_skill_ob[i] = NULL;
298 } 275 }
276
299 for (i = 0; i < NROFATTACKS; i++) 277 for (i = 0; i < NROFATTACKS; i++)
300 {
301 p->last_resist[i] = -1; 278 p->last_resist[i] = -1;
302 } 279
303 p->last_stats.exp = -1; 280 p->last_stats.exp = -1;
304 p->last_weight = (uint32) - 1; 281 p->last_weight = (uint32) - 1;
305 282
306 p->socket.update_look = 0; 283 p->socket->update_look = 0;
307 p->socket.look_position = 0; 284 p->socket->look_position = 0;
285
308 return p; 286 return p;
309} 287}
310 288
311/* This loads the first map an puts the player on it. */ 289/* This loads the first map an puts the player on it. */
312static void 290static void
322 * All we can really get in this is some settings like host and display 300 * All we can really get in this is some settings like host and display
323 * mode. 301 * mode.
324 */ 302 */
325 303
326int 304int
327add_player (NewSocket * ns) 305add_player (client *ns)
328{ 306{
329 player *p; 307 player *p = new player;
330 308
331 p = get_player (NULL);
332 p->socket = *ns; 309 p->socket = ns;
333 p->socket.faces_sent = (uint8 *) malloc (p->socket.faces_sent_len * sizeof (*p->socket.faces_sent)); 310 ns->pl = p;
334 if (p->socket.faces_sent == NULL) 311
335 fatal (OUT_OF_MEMORY); 312 p->next = first_player;
336 memcpy (p->socket.faces_sent, ns->faces_sent, p->socket.faces_sent_len * sizeof (*p->socket.faces_sent)); 313 first_player = p;
337 /* Needed because the socket we just copied over needs to be cleared. 314
338 * Note that this can result in a client reset if there is partial data 315 p = get_player (p);
339 * on the uncoming socket. 316
340 */
341 p->socket.inbuf.len = 0;
342 set_first_map (p->ob); 317 set_first_map (p->ob);
343 318
344 CLEAR_FLAG (p->ob, FLAG_FRIENDLY); 319 CLEAR_FLAG (p->ob, FLAG_FRIENDLY);
345 add_friendly_object (p->ob); 320 add_friendly_object (p->ob);
346 send_rules (p->ob); 321 send_rules (p->ob);
347 send_news (p->ob); 322 send_news (p->ob);
348 display_motd (p->ob); 323 display_motd (p->ob);
349 get_name (p->ob); 324 get_name (p->ob);
325
350 return 0; 326 return 0;
351} 327}
352 328
353/* 329/*
354 * get_player_archetype() return next player archetype from archetype 330 * get_player_archetype() return next player archetype from archetype
489path_to_player (object *mon, object *pl, unsigned mindiff) 465path_to_player (object *mon, object *pl, unsigned mindiff)
490{ 466{
491 rv_vector rv; 467 rv_vector rv;
492 sint16 x, y; 468 sint16 x, y;
493 int lastx, lasty, dir, i, diff, firstdir = 0, lastdir, max = MAX_SPACES, mflags, blocked; 469 int lastx, lasty, dir, i, diff, firstdir = 0, lastdir, max = MAX_SPACES, mflags, blocked;
494 mapstruct *m, *lastmap; 470 maptile *m, *lastmap;
495 471
496 get_rangevector (mon, pl, &rv, 0); 472 get_rangevector (mon, pl, &rv, 0);
497 473
498 if (rv.distance < mindiff) 474 if (rv.distance < mindiff)
499 return 0; 475 return 0;
643 (op->type == ARMOUR || op->type == BOOTS || 619 (op->type == ARMOUR || op->type == BOOTS ||
644 op->type == CLOAK || op->type == HELMET || 620 op->type == CLOAK || op->type == HELMET ||
645 op->type == SHIELD || op->type == GLOVES || 621 op->type == SHIELD || op->type == GLOVES ||
646 op->type == BRACERS || op->type == GIRDLE)) || (!QUERY_FLAG (pl, FLAG_USE_WEAPON) && op->type == WEAPON)) 622 op->type == BRACERS || op->type == GIRDLE)) || (!QUERY_FLAG (pl, FLAG_USE_WEAPON) && op->type == WEAPON))
647 { 623 {
648 remove_ob (op); 624 op->destroy ();
649 free_object (op);
650 continue; 625 continue;
651 } 626 }
652 } 627 }
653 628
654 /* This really needs to be better - we should really give 629 /* This really needs to be better - we should really give
665 if (tmp->type == op->type && tmp->name == op->name) 640 if (tmp->type == op->type && tmp->name == op->name)
666 break; 641 break;
667 642
668 if (tmp) 643 if (tmp)
669 { 644 {
670 remove_ob (op); 645 op->destroy ();
671 free_object (op);
672 LOG (llevError, "give_initial_items: Removing duplicate object %s\n", &tmp->name); 646 LOG (llevError, "give_initial_items: Removing duplicate object %s\n", &tmp->name);
673 continue; 647 continue;
674 } 648 }
649
675 if (op->nrof > 1) 650 if (op->nrof > 1)
676 op->nrof = 1; 651 op->nrof = 1;
677 } 652 }
678 653
679 if (op->type == SPELLBOOK && op->inv) 654 if (op->type == SPELLBOOK && op->inv)
691 CLEAR_FLAG (op, FLAG_CURSED); 666 CLEAR_FLAG (op, FLAG_CURSED);
692 CLEAR_FLAG (op, FLAG_DAMNED); 667 CLEAR_FLAG (op, FLAG_DAMNED);
693 } 668 }
694 if (op->type == SPELL) 669 if (op->type == SPELL)
695 { 670 {
696 remove_ob (op); 671 op->destroy ();
697 free_object (op);
698 continue; 672 continue;
699 } 673 }
700 else if (op->type == SKILL) 674 else if (op->type == SKILL)
701 { 675 {
702 SET_FLAG (op, FLAG_CAN_USE_SKILL); 676 SET_FLAG (op, FLAG_CAN_USE_SKILL);
715void 689void
716get_name (object *op) 690get_name (object *op)
717{ 691{
718 op->contr->write_buf[0] = '\0'; 692 op->contr->write_buf[0] = '\0';
719 op->contr->state = ST_GET_NAME; 693 op->contr->state = ST_GET_NAME;
720 send_query (&op->contr->socket, 0, "What is your name?\n:"); 694 send_query (op->contr->socket, 0, "What is your name?\n:");
721} 695}
722 696
723void 697void
724get_password (object *op) 698get_password (object *op)
725{ 699{
726 op->contr->write_buf[0] = '\0'; 700 op->contr->write_buf[0] = '\0';
727 op->contr->state = ST_GET_PASSWORD; 701 op->contr->state = ST_GET_PASSWORD;
728 send_query (&op->contr->socket, CS_QUERY_HIDEINPUT, "What is your password?\n:"); 702 send_query (op->contr->socket, CS_QUERY_HIDEINPUT, "What is your password?\n:");
729} 703}
730 704
731void 705void
732play_again (object *op) 706play_again (object *op)
733{ 707{
734 op->contr->state = ST_PLAY_AGAIN; 708 op->contr->state = ST_PLAY_AGAIN;
735 op->chosen_skill = NULL; 709 op->chosen_skill = NULL;
736 send_query (&op->contr->socket, CS_QUERY_SINGLECHAR, "Do you want to play again (a/q)?"); 710 send_query (op->contr->socket, CS_QUERY_SINGLECHAR, "Do you want to play again (a/q)?");
737 /* a bit of a hack, but there are various places early in th 711 /* a bit of a hack, but there are various places early in th
738 * player creation process that a user can quit (eg, roll 712 * player creation process that a user can quit (eg, roll
739 * stats) that isn't removing the player. Taking a quick 713 * stats) that isn't removing the player. Taking a quick
740 * look, there are many places that call play_again without 714 * look, there are many places that call play_again without
741 * removing the player - it probably makes more sense 715 * removing the player - it probably makes more sense
742 * to leave it to play_again to remove the object in all 716 * to leave it to play_again to remove the object in all
743 * cases. 717 * cases.
744 */ 718 */
745 if (!QUERY_FLAG (op, FLAG_REMOVED)) 719 if (!QUERY_FLAG (op, FLAG_REMOVED))
746 remove_ob (op); 720 op->remove ();
747 /* Need to set this to null - otherwise, it could point to garbage, 721 /* Need to set this to null - otherwise, it could point to garbage,
748 * and draw() doesn't check to see if the player is removed, only if 722 * and draw() doesn't check to see if the player is removed, only if
749 * the map is null or not swapped out. 723 * the map is null or not swapped out.
750 */ 724 */
751 op->map = NULL; 725 op->map = NULL;
765 player *pl = op->contr; 739 player *pl = op->contr;
766 shstr name = op->name; 740 shstr name = op->name;
767 741
768 op->contr = 0; 742 op->contr = 0;
769 op->type = 0; 743 op->type = 0;
770 op->free (1); 744 op->destroy (1);
771 pl = get_player (pl); 745 pl = get_player (pl);
772 op = pl->ob; 746 op = pl->ob;
773 add_friendly_object (op); 747 add_friendly_object (op);
774 op->contr->password[0] = '~'; 748 op->contr->password[0] = '~';
775 op->name = op->name_pl = 0; 749 op->name = op->name_pl = 0;
790confirm_password (object *op) 764confirm_password (object *op)
791{ 765{
792 766
793 op->contr->write_buf[0] = '\0'; 767 op->contr->write_buf[0] = '\0';
794 op->contr->state = ST_CONFIRM_PASSWORD; 768 op->contr->state = ST_CONFIRM_PASSWORD;
795 send_query (&op->contr->socket, CS_QUERY_HIDEINPUT, "Please type your password again.\n:"); 769 send_query (op->contr->socket, CS_QUERY_HIDEINPUT, "Please type your password again.\n:");
796} 770}
797 771
798void 772void
799get_party_password (object *op, partylist *party) 773get_party_password (object *op, partylist *party)
800{ 774{
804 return; 778 return;
805 } 779 }
806 op->contr->write_buf[0] = '\0'; 780 op->contr->write_buf[0] = '\0';
807 op->contr->state = ST_GET_PARTY_PASSWORD; 781 op->contr->state = ST_GET_PARTY_PASSWORD;
808 op->contr->party_to_join = party; 782 op->contr->party_to_join = party;
809 send_query (&op->contr->socket, CS_QUERY_HIDEINPUT, "What is the password?\n:"); 783 send_query (op->contr->socket, CS_QUERY_HIDEINPUT, "What is the password?\n:");
810} 784}
811 785
812 786
813/* This rolls four 1-6 rolls and sums the best 3 of the 4. */ 787/* This rolls four 1-6 rolls and sums the best 3 of the 4. */
814int 788int
911 885
912void 886void
913Roll_Again (object *op) 887Roll_Again (object *op)
914{ 888{
915 esrv_new_player (op->contr, 0); 889 esrv_new_player (op->contr, 0);
916 send_query (&op->contr->socket, CS_QUERY_SINGLECHAR, 890 send_query (op->contr->socket, CS_QUERY_SINGLECHAR,
917 "[y] to roll new stats [n] to use stats\n[1-7] [1-7] to swap stats.\nRoll again (y/n/1-7)? "); 891 "[y] to roll new stats [n] to use stats\n[1-7] [1-7] to swap stats.\nRoll again (y/n/1-7)? ");
918} 892}
919 893
920void 894void
921Swap_Stat (object *op, int Swap_Second) 895Swap_Stat (object *op, int Swap_Second)
988 new_draw_info (NDI_UNIQUE, 0, op, buf); 962 new_draw_info (NDI_UNIQUE, 0, op, buf);
989 } 963 }
990 else 964 else
991 Swap_Stat (op, stat_trans[keynum]); 965 Swap_Stat (op, stat_trans[keynum]);
992 966
993 send_query (&op->contr->socket, CS_QUERY_SINGLECHAR, ""); 967 send_query (op->contr->socket, CS_QUERY_SINGLECHAR, "");
994 return 1; 968 return 1;
995 } 969 }
996 switch (key) 970 switch (key)
997 { 971 {
998 case 'n': 972 case 'n':
1012 enter_exit (op, NULL); 986 enter_exit (op, NULL);
1013#endif 987#endif
1014 SET_ANIMATION (op, 2); /* So player faces south */ 988 SET_ANIMATION (op, 2); /* So player faces south */
1015 /* Enter exit adds a player otherwise */ 989 /* Enter exit adds a player otherwise */
1016 add_statbonus (op); 990 add_statbonus (op);
1017 send_query (&op->contr->socket, CS_QUERY_SINGLECHAR, 991 send_query (op->contr->socket, CS_QUERY_SINGLECHAR,
1018 "Now choose a character.\nPress any key to change outlook.\nPress `d' when you're pleased.\n"); 992 "Now choose a character.\nPress any key to change outlook.\nPress `d' when you're pleased.\n");
1019 op->contr->state = ST_CHANGE_CLASS; 993 op->contr->state = ST_CHANGE_CLASS;
1020 if (op->msg) 994 if (op->msg)
1021 new_draw_info (NDI_BLUE, 0, op, op->msg); 995 new_draw_info (NDI_BLUE, 0, op, op->msg);
1022 return 0; 996 return 0;
1023 } 997 }
1024 case 'y': 998 case 'y':
1025 case 'Y': 999 case 'Y':
1026 roll_stats (op); 1000 roll_stats (op);
1027 send_query (&op->contr->socket, CS_QUERY_SINGLECHAR, ""); 1001 send_query (op->contr->socket, CS_QUERY_SINGLECHAR, "");
1028 return 1; 1002 return 1;
1029 1003
1030 case 'q': 1004 case 'q':
1031 case 'Q': 1005 case 'Q':
1032 play_again (op); 1006 play_again (op);
1033 return 1; 1007 return 1;
1034 1008
1035 default: 1009 default:
1036 send_query (&op->contr->socket, CS_QUERY_SINGLECHAR, "Yes, No, Quit or 1-6. Roll again?"); 1010 send_query (op->contr->socket, CS_QUERY_SINGLECHAR, "Yes, No, Quit or 1-6. Roll again?");
1037 return 0; 1011 return 0;
1038 } 1012 }
1039 return 0; 1013 return 0;
1040} 1014}
1041 1015
1051{ 1025{
1052 int tmp_loop; 1026 int tmp_loop;
1053 1027
1054 if (key == 'q' || key == 'Q') 1028 if (key == 'q' || key == 'Q')
1055 { 1029 {
1056 remove_ob (op); 1030 op->remove ();
1057 play_again (op); 1031 play_again (op);
1058 return 0; 1032 return 0;
1059 } 1033 }
1060 if (key == 'd' || key == 'D') 1034 if (key == 'd' || key == 'D')
1061 { 1035 {
1062 char buf[MAX_BUF]; 1036 char buf[MAX_BUF];
1063 1037
1064 /* this must before then initial items are given */ 1038 /* this must before then initial items are given */
1065 esrv_new_player (op->contr, op->weight + op->carrying); 1039 esrv_new_player (op->contr, op->weight + op->carrying);
1040
1066 create_treasure (find_treasurelist ("starting_wealth"), op, 0, 0, 0); 1041 treasurelist *tl = find_treasurelist ("starting_wealth");
1042 if (tl)
1043 create_treasure (tl, op, 0, 0, 0);
1067 1044
1068 INVOKE_PLAYER (BIRTH, op->contr); 1045 INVOKE_PLAYER (BIRTH, op->contr);
1069 INVOKE_PLAYER (LOGIN, op->contr); 1046 INVOKE_PLAYER (LOGIN, op->contr);
1070 1047
1071 op->contr->state = ST_PLAYING; 1048 op->contr->state = ST_PLAYING;
1096 { 1073 {
1097 object *tmp; 1074 object *tmp;
1098 char mapname[MAX_BUF]; 1075 char mapname[MAX_BUF];
1099 1076
1100 snprintf (mapname, MAX_BUF - 1, "%s/%s", first_map_ext_path, &op->arch->name); 1077 snprintf (mapname, MAX_BUF - 1, "%s/%s", first_map_ext_path, &op->arch->name);
1101 tmp = get_object (); 1078 tmp = object::create ();
1102 EXIT_PATH (tmp) = mapname; 1079 EXIT_PATH (tmp) = mapname;
1103 EXIT_X (tmp) = op->x; 1080 EXIT_X (tmp) = op->x;
1104 EXIT_Y (tmp) = op->y; 1081 EXIT_Y (tmp) = op->y;
1105 enter_exit (op, tmp); /* we don't really care if it succeeded; 1082 enter_exit (op, tmp); /* we don't really care if it succeeded;
1106 * if the map isn't there, then stay on the 1083 * if the map isn't there, then stay on the
1107 * default initial map */ 1084 * default initial map */
1108 free_object (tmp); 1085 tmp->destroy ();
1109 } 1086 }
1110 else 1087 else
1111 { 1088 {
1112 LOG (llevDebug, "first_map_ext_path not set\n"); 1089 LOG (llevDebug, "first_map_ext_path not set\n");
1113 } 1090 }
1123 { 1100 {
1124 shstr name = op->name; 1101 shstr name = op->name;
1125 int x = op->x, y = op->y; 1102 int x = op->x, y = op->y;
1126 1103
1127 remove_statbonus (op); 1104 remove_statbonus (op);
1128 remove_ob (op); 1105 op->remove ();
1129 op->arch = get_player_archetype (op->arch); 1106 op->arch = get_player_archetype (op->arch);
1130 copy_object (&op->arch->clone, op); 1107 op->arch->clone.copy_to (op);
1131 op->instantiate (); 1108 op->instantiate ();
1132 op->stats = op->contr->orig_stats; 1109 op->stats = op->contr->orig_stats;
1133 op->name = op->name_pl = name; 1110 op->name = op->name_pl = name;
1134 op->x = x; 1111 op->x = x;
1135 op->y = y; 1112 op->y = y;
1148 op->stats.grace = 0; 1125 op->stats.grace = 0;
1149 1126
1150 if (op->msg) 1127 if (op->msg)
1151 new_draw_info (NDI_BLUE, 0, op, op->msg); 1128 new_draw_info (NDI_BLUE, 0, op, op->msg);
1152 1129
1153 send_query (&op->contr->socket, CS_QUERY_SINGLECHAR, "Press any key for the next race.\nPress `d' to play this race.\n"); 1130 send_query (op->contr->socket, CS_QUERY_SINGLECHAR, "Press any key for the next race.\nPress `d' to play this race.\n");
1154 return 0; 1131 return 0;
1155} 1132}
1156 1133
1157int 1134int
1158key_confirm_quit (object *op, char key) 1135key_confirm_quit (object *op, char key)
1180 if (settings.set_title == TRUE) 1157 if (settings.set_title == TRUE)
1181 op->contr->own_title[0] = '\0'; 1158 op->contr->own_title[0] = '\0';
1182 1159
1183 if (!QUERY_FLAG (op, FLAG_WAS_WIZ)) 1160 if (!QUERY_FLAG (op, FLAG_WAS_WIZ))
1184 { 1161 {
1185 mapstruct *mp, *next; 1162 maptile *mp, *next;
1186 1163
1187 /* We need to hunt for any per player unique maps in memory and 1164 /* We need to hunt for any per player unique maps in memory and
1188 * get rid of them. The trailing slash in the path is intentional, 1165 * get rid of them. The trailing slash in the path is intentional,
1189 * so that players named 'Ab' won't match against players 'Abe' pathname 1166 * so that players named 'Ab' won't match against players 'Abe' pathname
1190 */ 1167 */
1264 */ 1241 */
1265int 1242int
1266check_pick (object *op) 1243check_pick (object *op)
1267{ 1244{
1268 object *tmp, *next; 1245 object *tmp, *next;
1269 tag_t next_tag = 0, op_tag;
1270 int stop = 0; 1246 int stop = 0;
1271 int j, k, wvratio; 1247 int j, k, wvratio;
1272 char putstring[128], tmpstr[16]; 1248 char putstring[128], tmpstr[16];
1273 1249
1274
1275 /* if you're flying, you cna't pick up anything */ 1250 /* if you're flying, you cna't pick up anything */
1276 if (op->move_type & MOVE_FLYING) 1251 if (op->move_type & MOVE_FLYING)
1277 return 1; 1252 return 1;
1278 1253
1279 op_tag = op->count;
1280
1281 next = op->below; 1254 next = op->below;
1282 if (next)
1283 next_tag = next->count;
1284 1255
1285 /* loop while there are items on the floor that are not marked as 1256 /* loop while there are items on the floor that are not marked as
1286 * destroyed */ 1257 * destroyed */
1287 while (next && !was_destroyed (next, next_tag)) 1258 while (next && !next->destroyed ())
1288 { 1259 {
1289 tmp = next; 1260 tmp = next;
1290 next = tmp->below; 1261 next = tmp->below;
1291 if (next)
1292 next_tag = next->count;
1293 1262
1294 if (was_destroyed (op, op_tag)) 1263 if (op->destroyed ())
1295 return 0; 1264 return 0;
1296 1265
1297 if (!can_pick (op, tmp)) 1266 if (!can_pick (op, tmp))
1298 continue; 1267 continue;
1299 1268
1431 /* question: don't pick up known-poisonous stuff? */ 1400 /* question: don't pick up known-poisonous stuff? */
1432 if (op->contr->mode & PU_FOOD) 1401 if (op->contr->mode & PU_FOOD)
1433 if (tmp->type == FOOD) 1402 if (tmp->type == FOOD)
1434 { 1403 {
1435 pick_up (op, tmp); 1404 pick_up (op, tmp);
1436 if (0)
1437 fprintf (stderr, "FOOD\n");
1438 continue; 1405 continue;
1439 } 1406 }
1407
1440 if (op->contr->mode & PU_DRINK) 1408 if (op->contr->mode & PU_DRINK)
1441 if (tmp->type == DRINK || (tmp->type == POISON && !QUERY_FLAG (tmp, FLAG_KNOWN_CURSED))) 1409 if (tmp->type == DRINK || (tmp->type == POISON && !QUERY_FLAG (tmp, FLAG_KNOWN_CURSED)))
1442 { 1410 {
1443 pick_up (op, tmp); 1411 pick_up (op, tmp);
1444 if (0)
1445 fprintf (stderr, "DRINK\n");
1446 continue; 1412 continue;
1447 } 1413 }
1448 1414
1449 if (op->contr->mode & PU_POTION) 1415 if (op->contr->mode & PU_POTION)
1450 if (tmp->type == POTION) 1416 if (tmp->type == POTION)
1451 { 1417 {
1452 pick_up (op, tmp); 1418 pick_up (op, tmp);
1453 if (0)
1454 fprintf (stderr, "POTION\n");
1455 continue; 1419 continue;
1456 } 1420 }
1457 1421
1458 /* spellbooks, skillscrolls and normal books/scrolls */ 1422 /* spellbooks, skillscrolls and normal books/scrolls */
1459 if (op->contr->mode & PU_SPELLBOOK) 1423 if (op->contr->mode & PU_SPELLBOOK)
1460 if (tmp->type == SPELLBOOK) 1424 if (tmp->type == SPELLBOOK)
1461 { 1425 {
1462 pick_up (op, tmp); 1426 pick_up (op, tmp);
1463 if (0)
1464 fprintf (stderr, "SPELLBOOK\n");
1465 continue; 1427 continue;
1466 } 1428 }
1429
1467 if (op->contr->mode & PU_SKILLSCROLL) 1430 if (op->contr->mode & PU_SKILLSCROLL)
1468 if (tmp->type == SKILLSCROLL) 1431 if (tmp->type == SKILLSCROLL)
1469 { 1432 {
1470 pick_up (op, tmp); 1433 pick_up (op, tmp);
1471 if (0)
1472 fprintf (stderr, "SKILLSCROLL\n");
1473 continue; 1434 continue;
1474 } 1435 }
1436
1475 if (op->contr->mode & PU_READABLES) 1437 if (op->contr->mode & PU_READABLES)
1476 if (tmp->type == BOOK || tmp->type == SCROLL) 1438 if (tmp->type == BOOK || tmp->type == SCROLL)
1477 { 1439 {
1478 pick_up (op, tmp); 1440 pick_up (op, tmp);
1479 if (0)
1480 fprintf (stderr, "READABLES\n");
1481 continue; 1441 continue;
1482 } 1442 }
1483 1443
1484 /* wands/staves/rods/horns */ 1444 /* wands/staves/rods/horns */
1485 if (op->contr->mode & PU_MAGIC_DEVICE) 1445 if (op->contr->mode & PU_MAGIC_DEVICE)
1486 if (tmp->type == WAND || tmp->type == ROD || tmp->type == HORN) 1446 if (tmp->type == WAND || tmp->type == ROD || tmp->type == HORN)
1487 { 1447 {
1488 pick_up (op, tmp); 1448 pick_up (op, tmp);
1489 if (0)
1490 fprintf (stderr, "MAGIC_DEVICE\n");
1491 continue; 1449 continue;
1492 } 1450 }
1493 1451
1494 /* pick up all magical items */ 1452 /* pick up all magical items */
1495 if (op->contr->mode & PU_MAGICAL) 1453 if (op->contr->mode & PU_MAGICAL)
1496 if (QUERY_FLAG (tmp, FLAG_KNOWN_MAGICAL) && !QUERY_FLAG (tmp, FLAG_KNOWN_CURSED)) 1454 if (QUERY_FLAG (tmp, FLAG_KNOWN_MAGICAL) && !QUERY_FLAG (tmp, FLAG_KNOWN_CURSED))
1497 { 1455 {
1498 pick_up (op, tmp); 1456 pick_up (op, tmp);
1499 if (0)
1500 fprintf (stderr, "MAGICAL\n");
1501 continue; 1457 continue;
1502 } 1458 }
1503 1459
1504 if (op->contr->mode & PU_VALUABLES) 1460 if (op->contr->mode & PU_VALUABLES)
1505 { 1461 {
1506 if (tmp->type == MONEY || tmp->type == GEM) 1462 if (tmp->type == MONEY || tmp->type == GEM)
1507 { 1463 {
1508 pick_up (op, tmp); 1464 pick_up (op, tmp);
1509 if (0)
1510 fprintf (stderr, "MONEY/GEM\n");
1511 continue; 1465 continue;
1512 } 1466 }
1513 } 1467 }
1514 1468
1515 /* rings & amulets - talismans seems to be typed AMULET */ 1469 /* rings & amulets - talismans seems to be typed AMULET */
1516 if (op->contr->mode & PU_JEWELS) 1470 if (op->contr->mode & PU_JEWELS)
1517 if (tmp->type == RING || tmp->type == AMULET) 1471 if (tmp->type == RING || tmp->type == AMULET)
1518 { 1472 {
1519 pick_up (op, tmp); 1473 pick_up (op, tmp);
1474 continue;
1520 if (0) 1475 }
1521 fprintf (stderr, "JEWELS\n"); 1476
1477 /* we don't forget dragon food */
1478 if (op->contr->mode & PU_FLESH)
1479 if (tmp->type == FLESH)
1480 {
1481 pick_up (op, tmp);
1522 continue; 1482 continue;
1523 } 1483 }
1524 1484
1525 /* bows and arrows. Bows are good for selling! */ 1485 /* bows and arrows. Bows are good for selling! */
1526 if (op->contr->mode & PU_BOW) 1486 if (op->contr->mode & PU_BOW)
1527 if (tmp->type == BOW) 1487 if (tmp->type == BOW)
1528 { 1488 {
1529 pick_up (op, tmp); 1489 pick_up (op, tmp);
1530 if (0)
1531 fprintf (stderr, "BOW\n");
1532 continue; 1490 continue;
1533 } 1491 }
1492
1534 if (op->contr->mode & PU_ARROW) 1493 if (op->contr->mode & PU_ARROW)
1535 if (tmp->type == ARROW) 1494 if (tmp->type == ARROW)
1536 { 1495 {
1537 pick_up (op, tmp); 1496 pick_up (op, tmp);
1538 if (0)
1539 fprintf (stderr, "ARROW\n");
1540 continue; 1497 continue;
1541 } 1498 }
1542 1499
1543 /* all kinds of armor etc. */ 1500 /* all kinds of armor etc. */
1544 if (op->contr->mode & PU_ARMOUR) 1501 if (op->contr->mode & PU_ARMOUR)
1545 if (tmp->type == ARMOUR) 1502 if (tmp->type == ARMOUR)
1546 { 1503 {
1547 pick_up (op, tmp); 1504 pick_up (op, tmp);
1548 if (0)
1549 fprintf (stderr, "ARMOUR\n");
1550 continue; 1505 continue;
1551 } 1506 }
1507
1552 if (op->contr->mode & PU_HELMET) 1508 if (op->contr->mode & PU_HELMET)
1553 if (tmp->type == HELMET) 1509 if (tmp->type == HELMET)
1554 { 1510 {
1555 pick_up (op, tmp); 1511 pick_up (op, tmp);
1556 if (0)
1557 fprintf (stderr, "HELMET\n");
1558 continue; 1512 continue;
1559 } 1513 }
1514
1560 if (op->contr->mode & PU_SHIELD) 1515 if (op->contr->mode & PU_SHIELD)
1561 if (tmp->type == SHIELD) 1516 if (tmp->type == SHIELD)
1562 { 1517 {
1563 pick_up (op, tmp); 1518 pick_up (op, tmp);
1564 if (0)
1565 fprintf (stderr, "SHIELD\n");
1566 continue; 1519 continue;
1567 } 1520 }
1521
1568 if (op->contr->mode & PU_BOOTS) 1522 if (op->contr->mode & PU_BOOTS)
1569 if (tmp->type == BOOTS) 1523 if (tmp->type == BOOTS)
1570 { 1524 {
1571 pick_up (op, tmp); 1525 pick_up (op, tmp);
1572 if (0)
1573 fprintf (stderr, "BOOTS\n");
1574 continue; 1526 continue;
1575 } 1527 }
1528
1576 if (op->contr->mode & PU_GLOVES) 1529 if (op->contr->mode & PU_GLOVES)
1577 if (tmp->type == GLOVES) 1530 if (tmp->type == GLOVES)
1578 { 1531 {
1579 pick_up (op, tmp); 1532 pick_up (op, tmp);
1580 if (0)
1581 fprintf (stderr, "GLOVES\n");
1582 continue; 1533 continue;
1583 } 1534 }
1535
1584 if (op->contr->mode & PU_CLOAK) 1536 if (op->contr->mode & PU_CLOAK)
1585 if (tmp->type == CLOAK) 1537 if (tmp->type == CLOAK)
1586 { 1538 {
1587 pick_up (op, tmp); 1539 pick_up (op, tmp);
1588 if (0)
1589 fprintf (stderr, "GLOVES\n");
1590 continue; 1540 continue;
1591 } 1541 }
1592 1542
1593 /* hoping to catch throwing daggers here */ 1543 /* hoping to catch throwing daggers here */
1594 if (op->contr->mode & PU_MISSILEWEAPON) 1544 if (op->contr->mode & PU_MISSILEWEAPON)
1595 if (tmp->type == WEAPON && QUERY_FLAG (tmp, FLAG_IS_THROWN)) 1545 if (tmp->type == WEAPON && QUERY_FLAG (tmp, FLAG_IS_THROWN))
1596 { 1546 {
1597 pick_up (op, tmp); 1547 pick_up (op, tmp);
1598 if (0)
1599 fprintf (stderr, "MISSILEWEAPON\n");
1600 continue; 1548 continue;
1601 } 1549 }
1602 1550
1603 /* careful: chairs and tables are weapons! */ 1551 /* careful: chairs and tables are weapons! */
1604 if (op->contr->mode & PU_ALLWEAPON) 1552 if (op->contr->mode & PU_ALLWEAPON)
1607 { 1555 {
1608 if (strstr (tmp->name, "table") == NULL && strstr (tmp->arch->name, "table") == NULL && 1556 if (strstr (tmp->name, "table") == NULL && strstr (tmp->arch->name, "table") == NULL &&
1609 strstr (tmp->name, "chair") && strstr (tmp->arch->name, "chair") == NULL) 1557 strstr (tmp->name, "chair") && strstr (tmp->arch->name, "chair") == NULL)
1610 { 1558 {
1611 pick_up (op, tmp); 1559 pick_up (op, tmp);
1612 if (0)
1613 fprintf (stderr, "WEAPON\n");
1614 continue; 1560 continue;
1615 } 1561 }
1616 } 1562 }
1563
1617 if (tmp->type == WEAPON && tmp->name == NULL) 1564 if (tmp->type == WEAPON && tmp->name == NULL)
1618 { 1565 {
1619 if (strstr (tmp->arch->name, "table") == NULL && strstr (tmp->arch->name, "chair") == NULL) 1566 if (strstr (tmp->arch->name, "table") == NULL && strstr (tmp->arch->name, "chair") == NULL)
1620 { 1567 {
1621 pick_up (op, tmp); 1568 pick_up (op, tmp);
1622 if (0)
1623 fprintf (stderr, "WEAPON\n");
1624 continue; 1569 continue;
1625 } 1570 }
1626 } 1571 }
1627 } 1572 }
1628 1573
1629 /* misc stuff that's useful */ 1574 /* misc stuff that's useful */
1630 if (op->contr->mode & PU_KEY) 1575 if (op->contr->mode & PU_KEY)
1631 if (tmp->type == KEY || tmp->type == SPECIAL_KEY) 1576 if (tmp->type == KEY || tmp->type == SPECIAL_KEY)
1632 { 1577 {
1633 pick_up (op, tmp); 1578 pick_up (op, tmp);
1634 if (0)
1635 fprintf (stderr, "KEY\n");
1636 continue; 1579 continue;
1637 } 1580 }
1638 1581
1639 /* any of the last 4 bits set means we use the ratio for value 1582 /* any of the last 4 bits set means we use the ratio for value
1640 * pickups */ 1583 * pickups */
1662 continue; 1605 continue;
1663 } 1606 }
1664 } 1607 }
1665 } /* the new pickup model */ 1608 } /* the new pickup model */
1666 } 1609 }
1610
1667 return !stop; 1611 return !stop;
1668} 1612}
1669 1613
1670/* 1614/*
1671 * Find an arrow in the inventory and after that 1615 * Find an arrow in the inventory and after that
1770 1714
1771object * 1715object *
1772pick_arrow_target (object *op, const char *type, int dir) 1716pick_arrow_target (object *op, const char *type, int dir)
1773{ 1717{
1774 object *tmp = NULL; 1718 object *tmp = NULL;
1775 mapstruct *m; 1719 maptile *m;
1776 int i, mflags, found, number; 1720 int i, mflags, found, number;
1777 sint16 x, y; 1721 sint16 x, y;
1778 1722
1779 if (op->map == NULL) 1723 if (op->map == NULL)
1780 return find_arrow (op, type); 1724 return find_arrow (op, type);
1840 */ 1784 */
1841int 1785int
1842fire_bow (object *op, object *part, object *arrow, int dir, int wc_mod, sint16 sx, sint16 sy) 1786fire_bow (object *op, object *part, object *arrow, int dir, int wc_mod, sint16 sx, sint16 sy)
1843{ 1787{
1844 object *left, *bow; 1788 object *left, *bow;
1845 tag_t left_tag, tag;
1846 int bowspeed, mflags; 1789 int bowspeed, mflags;
1847 mapstruct *m; 1790 maptile *m;
1848 1791
1849 if (!dir) 1792 if (!dir)
1850 { 1793 {
1851 new_draw_info (NDI_UNIQUE, 0, op, "You can't shoot yourself!"); 1794 new_draw_info (NDI_UNIQUE, 0, op, "You can't shoot yourself!");
1852 return 0; 1795 return 0;
1906 } 1849 }
1907 1850
1908 /* this should not happen, but sometimes does */ 1851 /* this should not happen, but sometimes does */
1909 if (arrow->nrof == 0) 1852 if (arrow->nrof == 0)
1910 { 1853 {
1911 remove_ob (arrow); 1854 arrow->destroy ();
1912 free_object (arrow);
1913 return 0; 1855 return 0;
1914 } 1856 }
1915 1857
1916 left = arrow; /* these are arrows left to the player */ 1858 left = arrow; /* these are arrows left to the player */
1917 left_tag = left->count;
1918 arrow = get_split_ob (arrow, 1); 1859 arrow = get_split_ob (arrow, 1);
1919 if (arrow == NULL) 1860 if (arrow == NULL)
1920 { 1861 {
1921 new_draw_info_format (NDI_UNIQUE, 0, op, "You have no %s left.", &bow->race); 1862 new_draw_info_format (NDI_UNIQUE, 0, op, "You have no %s left.", &bow->race);
1922 return 0; 1863 return 0;
1923 } 1864 }
1924 set_owner (arrow, op); 1865 arrow->set_owner (op);
1925 arrow->skill = bow->skill; 1866 arrow->skill = bow->skill;
1926 1867
1927 arrow->direction = dir; 1868 arrow->direction = dir;
1928 arrow->x = sx; 1869 arrow->x = sx;
1929 arrow->y = sy; 1870 arrow->y = sy;
1937 SET_ANIMATION (arrow, arrow->direction); 1878 SET_ANIMATION (arrow, arrow->direction);
1938 arrow->stats.sp = arrow->stats.wc; /* save original wc and dam */ 1879 arrow->stats.sp = arrow->stats.wc; /* save original wc and dam */
1939 arrow->stats.hp = arrow->stats.dam; 1880 arrow->stats.hp = arrow->stats.dam;
1940 arrow->stats.grace = arrow->attacktype; 1881 arrow->stats.grace = arrow->attacktype;
1941 if (arrow->slaying != NULL) 1882 if (arrow->slaying != NULL)
1942 arrow->spellarg = strdup_local (arrow->slaying); 1883 arrow->spellarg = strdup (arrow->slaying);
1943 1884
1944 /* Note that this was different for monsters - they got their level 1885 /* Note that this was different for monsters - they got their level
1945 * added to the damage. I think the strength bonus is more proper. 1886 * added to the damage. I think the strength bonus is more proper.
1946 */ 1887 */
1947 1888
1965 arrow->level = op->chosen_skill ? op->chosen_skill->level : op->level; 1906 arrow->level = op->chosen_skill ? op->chosen_skill->level : op->level;
1966 } 1907 }
1967 else 1908 else
1968 { 1909 {
1969 arrow->stats.wc = op->stats.wc - bow->magic - arrow->magic - arrow->stats.wc + wc_mod; 1910 arrow->stats.wc = op->stats.wc - bow->magic - arrow->magic - arrow->stats.wc + wc_mod;
1970
1971 arrow->level = op->level; 1911 arrow->level = op->level;
1972 } 1912 }
1913
1973 if (arrow->attacktype == AT_PHYSICAL) 1914 if (arrow->attacktype == AT_PHYSICAL)
1974 arrow->attacktype |= bow->attacktype; 1915 arrow->attacktype |= bow->attacktype;
1916
1975 if (bow->slaying != NULL) 1917 if (bow->slaying != NULL)
1976 arrow->slaying = bow->slaying; 1918 arrow->slaying = bow->slaying;
1977 1919
1978 arrow->map = m; 1920 arrow->map = m;
1979 arrow->move_type = MOVE_FLY_LOW; 1921 arrow->move_type = MOVE_FLY_LOW;
1980 arrow->move_on = MOVE_FLY_LOW | MOVE_WALK; 1922 arrow->move_on = MOVE_FLY_LOW | MOVE_WALK;
1981 1923
1982 play_sound_map (op->map, op->x, op->y, SOUND_FIRE_ARROW); 1924 play_sound_map (op->map, op->x, op->y, SOUND_FIRE_ARROW);
1983 tag = arrow->count;
1984 insert_ob_in_map (arrow, m, op, 0); 1925 insert_ob_in_map (arrow, m, op, 0);
1985 1926
1986 if (!was_destroyed (arrow, tag)) 1927 if (!arrow->destroyed ())
1987 move_arrow (arrow); 1928 move_arrow (arrow);
1988 1929
1989 if (op->type == PLAYER) 1930 if (op->type == PLAYER)
1990 { 1931 {
1991 if (was_destroyed (left, left_tag)) 1932 if (left->destroyed ())
1992 esrv_del_item (op->contr, left_tag); 1933 esrv_del_item (op->contr, left->count);
1993 else 1934 else
1994 esrv_send_item (op, left); 1935 esrv_send_item (op, left);
1995 } 1936 }
1937
1996 return 1; 1938 return 1;
1997} 1939}
1998 1940
1999/* Special fire code for players - this takes into 1941/* Special fire code for players - this takes into
2000 * account the special fire modes players can have 1942 * account the special fire modes players can have
2136 case range_misc: 2078 case range_misc:
2137 fire_misc_object (op, dir); 2079 fire_misc_object (op, dir);
2138 return; 2080 return;
2139 2081
2140 case range_golem: /* Control summoned monsters from scrolls */ 2082 case range_golem: /* Control summoned monsters from scrolls */
2141 if (op->contr->ranges[range_golem] == NULL || op->contr->golem_count != op->contr->ranges[range_golem]->count) 2083 if (QUERY_FLAG (op->contr->ranges[range_golem], FLAG_REMOVED))
2142 { 2084 {
2143 op->contr->ranges[range_golem] = NULL; 2085 op->contr->ranges[range_golem] = 0;
2144 op->contr->shoottype = range_none; 2086 op->contr->shoottype = range_none;
2145 op->contr->golem_count = 0;
2146 } 2087 }
2147 else 2088 else
2148 control_golem (op->contr->ranges[range_golem], dir); 2089 control_golem (op->contr->ranges[range_golem], dir);
2149 return; 2090 return;
2150 2091
2312move_player_attack (object *op, int dir) 2253move_player_attack (object *op, int dir)
2313{ 2254{
2314 object *tmp, *mon; 2255 object *tmp, *mon;
2315 sint16 nx, ny; 2256 sint16 nx, ny;
2316 int on_battleground; 2257 int on_battleground;
2317 mapstruct *m; 2258 maptile *m;
2318 2259
2319 nx = freearr_x[dir] + op->x; 2260 nx = freearr_x[dir] + op->x;
2320 ny = freearr_y[dir] + op->y; 2261 ny = freearr_y[dir] + op->y;
2321 2262
2322 on_battleground = op_on_battleground (op, NULL, NULL); 2263 on_battleground = op_on_battleground (op, NULL, NULL);
2358 if (tmp == op) 2299 if (tmp == op)
2359 { 2300 {
2360 tmp = tmp->above; 2301 tmp = tmp->above;
2361 continue; 2302 continue;
2362 } 2303 }
2304
2363 if (QUERY_FLAG (tmp, FLAG_ALIVE)) 2305 if (QUERY_FLAG (tmp, FLAG_ALIVE))
2364 { 2306 {
2365 mon = tmp; 2307 mon = tmp;
2366 break; 2308 break;
2367 } 2309 }
2310
2368 if (tmp->type == LOCKED_DOOR || QUERY_FLAG (tmp, FLAG_CAN_ROLL)) 2311 if (tmp->type == LOCKED_DOOR || QUERY_FLAG (tmp, FLAG_CAN_ROLL))
2369 mon = tmp; 2312 mon = tmp;
2313
2370 tmp = tmp->above; 2314 tmp = tmp->above;
2371 } 2315 }
2372 2316
2373 if (mon == NULL) /* This happens anytime the player tries to move */ 2317 if (mon == NULL) /* This happens anytime the player tries to move */
2374 return; /* into a wall */ 2318 return; /* into a wall */
2393 * player owns it and it is either friendly or unagressive. 2337 * player owns it and it is either friendly or unagressive.
2394 */ 2338 */
2395 if ((op->type == PLAYER) 2339 if ((op->type == PLAYER)
2396#if COZY_SERVER 2340#if COZY_SERVER
2397 && 2341 &&
2398 ((get_owner (mon) && get_owner (mon)->contr 2342 ((mon->owner && mon->owner->contr
2399 && same_party (get_owner (mon)->contr->party, op->contr->party)) || get_owner (mon) == op) 2343 && same_party (mon->owner->contr->party, op->contr->party)) || mon->owner == op)
2400#else 2344#else
2401 && get_owner (mon) == op 2345 && mon->owner == op
2402#endif 2346#endif
2403 && (QUERY_FLAG (mon, FLAG_UNAGGRESSIVE) || QUERY_FLAG (mon, FLAG_FRIENDLY))) 2347 && (QUERY_FLAG (mon, FLAG_UNAGGRESSIVE) || QUERY_FLAG (mon, FLAG_FRIENDLY)))
2404 { 2348 {
2405 /* If we're braced, we don't want to switch places with it */ 2349 /* If we're braced, we don't want to switch places with it */
2406 if (op->contr->braced) 2350 if (op->contr->braced)
2593 /* I've been seeing crashes where the golem has been destroyed, but 2537 /* I've been seeing crashes where the golem has been destroyed, but
2594 * the player object still points to the defunct golem. The code that 2538 * the player object still points to the defunct golem. The code that
2595 * destroys the golem looks correct, and it doesn't always happen, so 2539 * destroys the golem looks correct, and it doesn't always happen, so
2596 * put this in a a workaround to clean up the golem pointer. 2540 * put this in a a workaround to clean up the golem pointer.
2597 */ 2541 */
2598 if (op->contr->ranges[range_golem] &&
2599 ((op->contr->golem_count != op->contr->ranges[range_golem]->count) || QUERY_FLAG (op->contr->ranges[range_golem], FLAG_REMOVED))) 2542 if (op->contr->ranges[range_golem] && QUERY_FLAG (op->contr->ranges[range_golem], FLAG_REMOVED))
2600 {
2601 op->contr->ranges[range_golem] = NULL; 2543 op->contr->ranges[range_golem] = 0;
2602 op->contr->golem_count = 0;
2603 }
2604 2544
2605 /* call this here - we also will call this in do_ericserver, but 2545 /* call this here - we also will call this in do_ericserver, but
2606 * the players time has been increased when doericserver has been 2546 * the players time has been increased when doericserver has been
2607 * called, so we recheck it here. 2547 * called, so we recheck it here.
2608 */ 2548 */
2609 HandleClient (&op->contr->socket, op->contr); 2549 op->contr->socket->handle_command ();
2610 if (op->speed_left < 0) 2550 if (op->speed_left < 0)
2611 return 0; 2551 return 0;
2612 2552
2613 if (op->direction && (op->contr->run_on || op->contr->fire_on)) 2553 if (op->direction && (op->contr->run_on || op->contr->fire_on))
2614 { 2554 {
2623 if (op->speed_left > 0) 2563 if (op->speed_left > 0)
2624 return 1; 2564 return 1;
2625 else 2565 else
2626 return 0; 2566 return 0;
2627 } 2567 }
2568
2628 return 0; 2569 return 0;
2629} 2570}
2630 2571
2631int 2572int
2632save_life (object *op) 2573save_life (object *op)
2633{ 2574{
2634 object *tmp;
2635
2636 if (!QUERY_FLAG (op, FLAG_LIFESAVE)) 2575 if (!QUERY_FLAG (op, FLAG_LIFESAVE))
2637 return 0; 2576 return 0;
2638 2577
2639 for (tmp = op->inv; tmp != NULL; tmp = tmp->below) 2578 for (object *tmp = op->inv; tmp; tmp = tmp->below)
2640 if (QUERY_FLAG (tmp, FLAG_APPLIED) && QUERY_FLAG (tmp, FLAG_LIFESAVE)) 2579 if (QUERY_FLAG (tmp, FLAG_APPLIED) && QUERY_FLAG (tmp, FLAG_LIFESAVE))
2641 { 2580 {
2642 play_sound_map (op->map, op->x, op->y, SOUND_OB_EVAPORATE); 2581 play_sound_map (op->map, op->x, op->y, SOUND_OB_EVAPORATE);
2643 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s vibrates violently, then evaporates.", query_name (tmp)); 2582 new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s vibrates violently, then evaporates.", query_name (tmp));
2583
2644 if (op->contr) 2584 if (op->contr)
2645 esrv_del_item (op->contr, tmp->count); 2585 esrv_del_item (op->contr, tmp->count);
2646 remove_ob (tmp); 2586
2647 free_object (tmp); 2587 tmp->destroy ();
2648 CLEAR_FLAG (op, FLAG_LIFESAVE); 2588 CLEAR_FLAG (op, FLAG_LIFESAVE);
2589
2649 if (op->stats.hp < 0) 2590 if (op->stats.hp < 0)
2650 op->stats.hp = op->stats.maxhp; 2591 op->stats.hp = op->stats.maxhp;
2592
2651 if (op->stats.food < 0) 2593 if (op->stats.food < 0)
2652 op->stats.food = 999; 2594 op->stats.food = 999;
2595
2653 fix_player (op); 2596 fix_player (op);
2654 return 1; 2597 return 1;
2655 } 2598 }
2599
2656 LOG (llevError, "Error: LIFESAVE set without applied object.\n"); 2600 LOG (llevError, "Error: LIFESAVE set without applied object.\n");
2657 CLEAR_FLAG (op, FLAG_LIFESAVE); 2601 CLEAR_FLAG (op, FLAG_LIFESAVE);
2658 enter_player_savebed (op); /* bring him home. */ 2602 enter_player_savebed (op); /* bring him home. */
2659 return 0; 2603 return 0;
2660} 2604}
2674 next = op->below; /* Make sure we have a good value, in case 2618 next = op->below; /* Make sure we have a good value, in case
2675 * we remove object 'op' 2619 * we remove object 'op'
2676 */ 2620 */
2677 if (QUERY_FLAG (op, FLAG_UNPAID)) 2621 if (QUERY_FLAG (op, FLAG_UNPAID))
2678 { 2622 {
2679 remove_ob (op); 2623 op->remove ();
2680 op->x = env->x; 2624 op->x = env->x;
2681 op->y = env->y; 2625 op->y = env->y;
2682 if (env->type == PLAYER) 2626 if (env->type == PLAYER)
2683 esrv_del_item (env->contr, op->count); 2627 esrv_del_item (env->contr, op->count);
2684 insert_ob_in_map (op, env->map, NULL, 0); 2628 insert_ob_in_map (op, env->map, NULL, 0);
2685 } 2629 }
2686 else if (op->inv) 2630 else if (op->inv)
2687 remove_unpaid_objects (op->inv, env); 2631 remove_unpaid_objects (op->inv, env);
2632
2688 op = next; 2633 op = next;
2689 } 2634 }
2690} 2635}
2691 2636
2692 2637
2707 strcpy (buf2, " R.I.P.\n\n"); 2652 strcpy (buf2, " R.I.P.\n\n");
2708 if (op->type == PLAYER) 2653 if (op->type == PLAYER)
2709 sprintf (buf, "%s the %s\n", &op->name, op->contr->title); 2654 sprintf (buf, "%s the %s\n", &op->name, op->contr->title);
2710 else 2655 else
2711 sprintf (buf, "%s\n", &op->name); 2656 sprintf (buf, "%s\n", &op->name);
2657
2712 strncat (buf2, " ", 20 - strlen (buf) / 2); 2658 strncat (buf2, " ", 20 - strlen (buf) / 2);
2713 strcat (buf2, buf); 2659 strcat (buf2, buf);
2714 if (op->type == PLAYER) 2660 if (op->type == PLAYER)
2715 sprintf (buf, "who was in level %d when killed\n", op->level); 2661 sprintf (buf, "who was in level %d when killed\n", op->level);
2716 else 2662 else
2717 sprintf (buf, "who was in level %d when died.\n\n", op->level); 2663 sprintf (buf, "who was in level %d when died.\n\n", op->level);
2664
2718 strncat (buf2, " ", 20 - strlen (buf) / 2); 2665 strncat (buf2, " ", 20 - strlen (buf) / 2);
2719 strcat (buf2, buf); 2666 strcat (buf2, buf);
2720 if (op->type == PLAYER) 2667 if (op->type == PLAYER)
2721 { 2668 {
2722 sprintf (buf, "by %s.\n\n", op->contr->killer); 2669 sprintf (buf, "by %s.\n\n", op->contr->killer);
2723 strncat (buf2, " ", 21 - strlen (buf) / 2); 2670 strncat (buf2, " ", 21 - strlen (buf) / 2);
2724 strcat (buf2, buf); 2671 strcat (buf2, buf);
2725 } 2672 }
2673
2726 strftime (buf, MAX_BUF, "%b %d %Y\n", localtime (&now)); 2674 strftime (buf, MAX_BUF, "%b %d %Y\n", localtime (&now));
2727 strncat (buf2, " ", 20 - strlen (buf) / 2); 2675 strncat (buf2, " ", 20 - strlen (buf) / 2);
2728 strcat (buf2, buf); 2676 strcat (buf2, buf);
2677
2729 return buf2; 2678 return buf2;
2730} 2679}
2731 2680
2732 2681
2733 2682
2952{ 2901{
2953 char buf[MAX_BUF]; 2902 char buf[MAX_BUF];
2954 int x, y; 2903 int x, y;
2955 2904
2956 //int i; 2905 //int i;
2957 mapstruct *map; /* this is for resurrection */ 2906 maptile *map; /* this is for resurrection */
2958 2907
2959 /* int z; 2908 /* int z;
2960 int num_stats_lose; 2909 int num_stats_lose;
2961 int lost_a_stat; 2910 int lost_a_stat;
2962 int lose_this_stat; 2911 int lose_this_stat;
2977 { 2926 {
2978 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "You have been defeated in combat!"); 2927 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "You have been defeated in combat!");
2979 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "Local medics have saved your life..."); 2928 new_draw_info (NDI_UNIQUE | NDI_NAVY, 0, op, "Local medics have saved your life...");
2980 2929
2981 /* restore player */ 2930 /* restore player */
2982 at = find_archetype ("poisoning"); 2931 at = archetype::find ("poisoning");
2983 tmp = present_arch_in_ob (at, op); 2932 tmp = present_arch_in_ob (at, op);
2984 if (tmp) 2933 if (tmp)
2985 { 2934 {
2986 remove_ob (tmp); 2935 tmp->destroy ();
2987 free_object (tmp);
2988 new_draw_info (NDI_UNIQUE, 0, op, "Your body feels cleansed"); 2936 new_draw_info (NDI_UNIQUE, 0, op, "Your body feels cleansed");
2989 } 2937 }
2990 2938
2991 at = find_archetype ("confusion"); 2939 at = archetype::find ("confusion");
2992 tmp = present_arch_in_ob (at, op); 2940 tmp = present_arch_in_ob (at, op);
2993 if (tmp) 2941 if (tmp)
2994 { 2942 {
2995 remove_ob (tmp); 2943 tmp->destroy ();
2996 free_object (tmp);
2997 new_draw_info (NDI_UNIQUE, 0, tmp, "Your mind feels clearer"); 2944 new_draw_info (NDI_UNIQUE, 0, tmp, "Your mind feels clearer");
2998 } 2945 }
2999 2946
3000 cure_disease (op, 0); /* remove any disease */ 2947 cure_disease (op, 0); /* remove any disease */
3001 op->stats.hp = op->stats.maxhp; 2948 op->stats.hp = op->stats.maxhp;
3002 if (op->stats.food <= 0) 2949 if (op->stats.food <= 0)
3003 op->stats.food = 999; 2950 op->stats.food = 999;
3004 2951
3005 /* create a bodypart-trophy to make the winner happy */ 2952 /* create a bodypart-trophy to make the winner happy */
3006 tmp = arch_to_object (find_archetype ("finger")); 2953 tmp = arch_to_object (archetype::find ("finger"));
3007 if (tmp != NULL) 2954 if (tmp != NULL)
3008 { 2955 {
3009 sprintf (buf, "%s's finger", &op->name); 2956 sprintf (buf, "%s's finger", &op->name);
3010 tmp->name = buf; 2957 tmp->name = buf;
3011 sprintf (buf, " This finger has been cut off %s\n" 2958 sprintf (buf, " This finger has been cut off %s\n"
3108 lost_a_stat = 1; 3055 lost_a_stat = 1;
3109 } 3056 }
3110 else 3057 else
3111 { 3058 {
3112 /* deplete a stat */ 3059 /* deplete a stat */
3113 archetype *deparch = find_archetype ("depletion"); 3060 archetype *deparch = archetype::find ("depletion");
3114 object *dep; 3061 object *dep;
3115 3062
3116 dep = present_arch_in_ob (deparch, op); 3063 dep = present_arch_in_ob (deparch, op);
3117 if (!dep) 3064 if (!dep)
3118 { 3065 {
3178 /* determine_god() seems to not work sometimes... why is this? 3125 /* determine_god() seems to not work sometimes... why is this?
3179 Should I be using something else? GD */ 3126 Should I be using something else? GD */
3180 const char *god = determine_god (op); 3127 const char *god = determine_god (op);
3181 3128
3182 if (god && (strcmp (god, "none"))) 3129 if (god && (strcmp (god, "none")))
3183 new_draw_info_format (NDI_UNIQUE, 0, op, "For a brief " "moment you feel the holy presence of %s protecting" " you.", god); 3130 new_draw_info_format (NDI_UNIQUE, 0, op, "For a brief moment you feel the holy presence of %s protecting" " you.", god);
3184 else 3131 else
3185 new_draw_info (NDI_UNIQUE, 0, op, "For a brief moment you" " feel a holy presence protecting you."); 3132 new_draw_info (NDI_UNIQUE, 0, op, "For a brief moment you feel a holy presence protecting you.");
3186 } 3133 }
3134#else
3135 new_draw_info (NDI_UNIQUE, 0, op, "For a brief moment you" " feel a holy presence protecting you from losing yourself completely.");
3187#endif 3136#endif
3188 new_draw_info (NDI_UNIQUE, 0, op, "For a brief moment you" " feel a holy presence protecting you from losing yourself completely.");
3189 3137
3190 /* Put a gravestone up where the character 'almost' died. List the 3138 /* Put a gravestone up where the character 'almost' died. List the
3191 * exp loss on the stone. 3139 * exp loss on the stone.
3192 */ 3140 */
3193 tmp = arch_to_object (find_archetype ("gravestone")); 3141 tmp = arch_to_object (archetype::find ("gravestone"));
3194 sprintf (buf, "%s's gravestone", &op->name); 3142 sprintf (buf, "%s's gravestone", &op->name);
3195 tmp->name = buf; 3143 tmp->name = buf;
3196 sprintf (buf, "%s's gravestones", &op->name); 3144 sprintf (buf, "%s's gravestones", &op->name);
3197 tmp->name_pl = buf; 3145 tmp->name_pl = buf;
3198 sprintf (buf, "RIP\nHere rests the hero %s the %s,\n" "who was killed\n" "by %s.\n", &op->name, op->contr->title, op->contr->killer); 3146 sprintf (buf, "RIP\nHere rests the hero %s the %s,\n" "who was killed\n" "by %s.\n", &op->name, op->contr->title, op->contr->killer);
3199 tmp->msg = buf; 3147 tmp->msg = buf;
3200 tmp->x = op->x, tmp->y = op->y; 3148 tmp->x = op->x, tmp->y = op->y;
3201 insert_ob_in_map (tmp, op->map, NULL, 0); 3149 insert_ob_in_map (tmp, op->map, NULL, 0);
3202 3150
3203 /**************************************/ 3151 /**************************************/
3204 /* */ 3152 /* */
3205 /* Subtract the experience points, */ 3153 /* Subtract the experience points, */
3206 /* if we died cause of food, give us */ 3154 /* if we died cause of food, give us */
3207 /* food, and reset HP's... */ 3155 /* food, and reset HP's... */
3208 /* */ 3156 /* */
3209
3210 /**************************************/ 3157 /**************************************/
3211 3158
3212 /* remove any poisoning and confusion the character may be suffering. */ 3159 /* remove any poisoning and confusion the character may be suffering. */
3213 /* restore player */ 3160 /* restore player */
3214 at = find_archetype ("poisoning"); 3161 at = archetype::find ("poisoning");
3162 tmp = present_arch_in_ob (at, op);
3163
3164 if (tmp)
3165 {
3166 tmp->destroy ();
3167 new_draw_info (NDI_UNIQUE, 0, op, "Your body feels cleansed");
3168 }
3169
3170 at = archetype::find ("confusion");
3215 tmp = present_arch_in_ob (at, op); 3171 tmp = present_arch_in_ob (at, op);
3216 if (tmp) 3172 if (tmp)
3217 { 3173 {
3218 remove_ob (tmp); 3174 tmp->destroy ();
3219 free_object (tmp);
3220 new_draw_info (NDI_UNIQUE, 0, op, "Your body feels cleansed");
3221 }
3222
3223 at = find_archetype ("confusion");
3224 tmp = present_arch_in_ob (at, op);
3225 if (tmp)
3226 {
3227 remove_ob (tmp);
3228 free_object (tmp);
3229 new_draw_info (NDI_UNIQUE, 0, tmp, "Your mind feels clearer"); 3175 new_draw_info (NDI_UNIQUE, 0, tmp, "Your mind feels clearer");
3230 } 3176 }
3177
3231 cure_disease (op, 0); /* remove any disease */ 3178 cure_disease (op, 0); /* remove any disease */
3232 3179
3233 /*add_exp(op, (op->stats.exp * -0.20)); */ 3180 /*add_exp(op, (op->stats.exp * -0.20)); */
3234 apply_death_exp_penalty (op); 3181 apply_death_exp_penalty (op);
3235 if (op->stats.food < 100) 3182 if (op->stats.food < 100)
3245 */ 3192 */
3246 3193
3247 if (is_in_shop (op)) 3194 if (is_in_shop (op))
3248 remove_unpaid_objects (op->inv, op); 3195 remove_unpaid_objects (op->inv, op);
3249 3196
3250 /****************************************/ 3197 /****************************************/
3251 /* */ 3198 /* */
3252 /* Move player to his current respawn- */ 3199 /* Move player to his current respawn- */
3253 /* position (usually last savebed) */ 3200 /* position (usually last savebed) */
3254 /* */ 3201 /* */
3255
3256 /****************************************/ 3202 /****************************************/
3257 3203
3258 enter_player_savebed (op); 3204 enter_player_savebed (op);
3259 3205
3260 /* Save the player before inserting the force to reduce 3206 /* Save the player before inserting the force to reduce
3261 * chance of abuse. 3207 * chance of abuse.
3268 * spell effects. So first see if there is a spell effect 3214 * spell effects. So first see if there is a spell effect
3269 * on the space that might harm the player. 3215 * on the space that might harm the player.
3270 */ 3216 */
3271 will_kill_again = 0; 3217 will_kill_again = 0;
3272 for (tmp = get_map_ob (op->map, op->x, op->y); tmp; tmp = tmp->above) 3218 for (tmp = get_map_ob (op->map, op->x, op->y); tmp; tmp = tmp->above)
3273 {
3274 if (tmp->type == SPELL_EFFECT) 3219 if (tmp->type == SPELL_EFFECT)
3275 will_kill_again |= tmp->attacktype; 3220 will_kill_again |= tmp->attacktype;
3276 } 3221
3277 if (will_kill_again) 3222 if (will_kill_again)
3278 { 3223 {
3279 object *force; 3224 object *force;
3280 int at; 3225 int at;
3281 3226
3283 /* 50 ticks should be enough time for the spell to abate */ 3228 /* 50 ticks should be enough time for the spell to abate */
3284 force->speed = 0.1; 3229 force->speed = 0.1;
3285 force->speed_left = -5.0; 3230 force->speed_left = -5.0;
3286 SET_FLAG (force, FLAG_APPLIED); 3231 SET_FLAG (force, FLAG_APPLIED);
3287 for (at = 0; at < NROFATTACKS; at++) 3232 for (at = 0; at < NROFATTACKS; at++)
3288 {
3289 if (will_kill_again & (1 << at)) 3233 if (will_kill_again & (1 << at))
3290 force->resist[at] = 100; 3234 force->resist[at] = 100;
3291 } 3235
3292 insert_ob_in_ob (force, op); 3236 insert_ob_in_ob (force, op);
3293 fix_player (op); 3237 fix_player (op);
3294 3238
3295 } 3239 }
3296 3240
3306 op->contr->party = NULL; 3250 op->contr->party = NULL;
3307 if (settings.set_title == TRUE) 3251 if (settings.set_title == TRUE)
3308 op->contr->own_title[0] = '\0'; 3252 op->contr->own_title[0] = '\0';
3309 new_draw_info (NDI_UNIQUE | NDI_ALL, 0, NULL, buf); 3253 new_draw_info (NDI_UNIQUE | NDI_ALL, 0, NULL, buf);
3310 check_score (op); 3254 check_score (op);
3255
3311 if (op->contr->ranges[range_golem] != NULL) 3256 if (op->contr->ranges[range_golem])
3312 { 3257 {
3313 remove_friendly_object (op->contr->ranges[range_golem]); 3258 remove_friendly_object (op->contr->ranges[range_golem]);
3314 remove_ob (op->contr->ranges[range_golem]); 3259 op->contr->ranges[range_golem]->destroy ();
3315 free_object (op->contr->ranges[range_golem]);
3316 op->contr->ranges[range_golem] = NULL; 3260 op->contr->ranges[range_golem] = 0;
3317 op->contr->golem_count = 0;
3318 } 3261 }
3262
3319 loot_object (op); /* Remove some of the items for good */ 3263 loot_object (op); /* Remove some of the items for good */
3320 remove_ob (op); 3264 op->remove ();
3321 op->direction = 0; 3265 op->direction = 0;
3322 3266
3323 if (!QUERY_FLAG (op, FLAG_WAS_WIZ) && op->stats.exp) 3267 if (!QUERY_FLAG (op, FLAG_WAS_WIZ) && op->stats.exp)
3324 { 3268 {
3325 delete_character (op->name, 0); 3269 delete_character (op->name, 0);
3350 } 3294 }
3351 3295
3352 play_again (op); 3296 play_again (op);
3353 3297
3354 /* peterm: added to create a corpse at deathsite. */ 3298 /* peterm: added to create a corpse at deathsite. */
3355 tmp = arch_to_object (find_archetype ("corpse_pl")); 3299 tmp = arch_to_object (archetype::find ("corpse_pl"));
3356 sprintf (buf, "%s", &op->name); 3300 sprintf (buf, "%s", &op->name);
3357 tmp->name = tmp->name_pl = buf; 3301 tmp->name = tmp->name_pl = buf;
3358 tmp->level = op->level; 3302 tmp->level = op->level;
3359 tmp->x = x; 3303 tmp->x = x;
3360 tmp->y = y; 3304 tmp->y = y;
3378 for (tmp = op->inv; tmp != NULL; tmp = next) 3322 for (tmp = op->inv; tmp != NULL; tmp = next)
3379 { 3323 {
3380 next = tmp->below; 3324 next = tmp->below;
3381 if (tmp->type == EXPERIENCE || tmp->invisible) 3325 if (tmp->type == EXPERIENCE || tmp->invisible)
3382 continue; 3326 continue;
3383 remove_ob (tmp); 3327 tmp->remove ();
3384 tmp->x = op->x, tmp->y = op->y; 3328 tmp->x = op->x, tmp->y = op->y;
3385 if (tmp->type == CONTAINER) 3329 if (tmp->type == CONTAINER)
3386 { /* empty container to ground */ 3330 { /* empty container to ground */
3387 loot_object (tmp); 3331 loot_object (tmp);
3388 } 3332 }
3389 if (!QUERY_FLAG (tmp, FLAG_UNIQUE) && (QUERY_FLAG (tmp, FLAG_STARTEQUIP) || QUERY_FLAG (tmp, FLAG_NO_DROP) || !(RANDOM () % 3))) 3333 if (!QUERY_FLAG (tmp, FLAG_UNIQUE) && (QUERY_FLAG (tmp, FLAG_STARTEQUIP) || QUERY_FLAG (tmp, FLAG_NO_DROP) || !(RANDOM () % 3)))
3390 { 3334 {
3391 if (tmp->nrof > 1) 3335 if (tmp->nrof > 1)
3392 { 3336 {
3393 tmp2 = get_split_ob (tmp, 1 + RANDOM () % (tmp->nrof - 1)); 3337 tmp2 = get_split_ob (tmp, 1 + RANDOM () % (tmp->nrof - 1));
3394 free_object (tmp2); 3338 tmp2->destroy ();
3395 insert_ob_in_map (tmp, op->map, NULL, 0); 3339 insert_ob_in_map (tmp, op->map, NULL, 0);
3396 } 3340 }
3397 else 3341 else
3398 free_object (tmp); 3342 tmp->destroy ();
3399 } 3343 }
3400 else 3344 else
3401 insert_ob_in_map (tmp, op->map, NULL, 0); 3345 insert_ob_in_map (tmp, op->map, NULL, 0);
3402 } 3346 }
3403} 3347}
3468 if (op->type == PLAYER) 3412 if (op->type == PLAYER)
3469 new_draw_info_format (NDI_UNIQUE, 0, op, "You cast %s.", &spob->name); 3413 new_draw_info_format (NDI_UNIQUE, 0, op, "You cast %s.", &spob->name);
3470 3414
3471 cast_spell (op, throw_ob, dir, spob, NULL); 3415 cast_spell (op, throw_ob, dir, spob, NULL);
3472 3416
3473 if (!QUERY_FLAG (throw_ob, FLAG_REMOVED)) 3417 throw_ob->destroy ();
3474 remove_ob (throw_ob);
3475 free_object (throw_ob);
3476} 3418}
3477 3419
3478void 3420void
3479make_visible (object *op) 3421make_visible (object *op)
3480{ 3422{
3596int 3538int
3597stand_near_hostile (object *who) 3539stand_near_hostile (object *who)
3598{ 3540{
3599 object *tmp = NULL; 3541 object *tmp = NULL;
3600 int i, friendly = 0, player = 0, mflags; 3542 int i, friendly = 0, player = 0, mflags;
3601 mapstruct *m; 3543 maptile *m;
3602 sint16 x, y; 3544 sint16 x, y;
3603 3545
3604 if (!who) 3546 if (!who)
3605 return 0; 3547 return 0;
3606 3548
3687 3629
3688 /* only the viewable area the player sees is updated by LOS 3630 /* only the viewable area the player sees is updated by LOS
3689 * code, so we need to restrict ourselves to that range of values 3631 * code, so we need to restrict ourselves to that range of values
3690 * for any meaningful values. 3632 * for any meaningful values.
3691 */ 3633 */
3692 if (FABS (dx) <= (pl->contr->socket.mapx / 2) && 3634 if (FABS (dx) <= (pl->contr->socket->mapx / 2) &&
3693 FABS (dy) <= (pl->contr->socket.mapy / 2) && 3635 FABS (dy) <= (pl->contr->socket->mapy / 2) &&
3694 !pl->contr->blocked_los[dx + (pl->contr->socket.mapx / 2)][dy + (pl->contr->socket.mapy / 2)]) 3636 !pl->contr->blocked_los[dx + (pl->contr->socket->mapx / 2)][dy + (pl->contr->socket->mapy / 2)])
3695 return 1; 3637 return 1;
3696 op = op->more; 3638 op = op->more;
3697 } 3639 }
3698 return 0; 3640 return 0;
3699} 3641}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines