|
Crossfire Client, Trunk
R18666
|
00001 const char * const rcsid_gtk2_pickup_c = 00002 "$Id: pickup.c 13958 2010-10-02 09:34:23Z ryo_saeba $"; 00003 00004 /* 00005 Crossfire client, a client program for the crossfire program. 00006 00007 Copyright (C) 2005-2010 Mark Wedel & Crossfire Development Team 00008 00009 This program is free software; you can redistribute it and/or modify 00010 it under the terms of the GNU General Public License as published by 00011 the Free Software Foundation; either version 2 of the License, or 00012 (at your option) any later version. 00013 00014 This program is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 GNU General Public License for more details. 00018 00019 You should have received a copy of the GNU General Public License 00020 along with this program; if not, write to the Free Software 00021 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00022 00023 The author can be reached via e-mail to crossfire@metalforge.org 00024 */ 00025 00033 #ifdef HAVE_CONFIG_H 00034 # include <config.h> 00035 #endif 00036 00037 #include <gtk/gtk.h> 00038 #include <glade/glade.h> 00039 00040 #include "client.h" 00041 #include "main.h" 00042 #include "image.h" 00043 #include "gtk2proto.h" 00044 00045 typedef struct { 00046 GtkWidget *menuitem; 00047 uint32 pickup_mode; 00048 } PickupMapping; 00049 00050 #define MAX_PICKUPS 50 00051 00052 PickupMapping pickup_mapping[MAX_PICKUPS]; 00053 static int num_pickups=0; 00054 00055 /* 00056 * Definitions for detailed pickup descriptions. The objective is to define 00057 * intelligent groups of items that the user can pick up or leave as he likes. 00058 */ 00059 00060 /* High bit as flag for new pickup options */ 00061 #define PU_NOTHING 0x00000000 00062 00063 #define PU_DEBUG 0x10000000 00064 #define PU_INHIBIT 0x20000000 00065 #define PU_STOP 0x40000000 00066 #define PU_NEWMODE 0x80000000 00067 00068 #define PU_RATIO 0x0000000F 00069 00070 #define PU_FOOD 0x00000010 00071 #define PU_DRINK 0x00000020 00072 #define PU_VALUABLES 0x00000040 00073 #define PU_BOW 0x00000080 00074 00075 #define PU_ARROW 0x00000100 00076 #define PU_HELMET 0x00000200 00077 #define PU_SHIELD 0x00000400 00078 #define PU_ARMOUR 0x00000800 00079 00080 #define PU_BOOTS 0x00001000 00081 #define PU_GLOVES 0x00002000 00082 #define PU_CLOAK 0x00004000 00083 #define PU_KEY 0x00008000 00084 00085 #define PU_MISSILEWEAPON 0x00010000 00086 #define PU_ALLWEAPON 0x00020000 00087 #define PU_MAGICAL 0x00040000 00088 #define PU_POTION 0x00080000 00089 00090 #define PU_SPELLBOOK 0x00100000 00091 #define PU_SKILLSCROLL 0x00200000 00092 #define PU_READABLES 0x00400000 00093 #define PU_MAGIC_DEVICE 0x00800000 00094 00095 #define PU_NOT_CURSED 0x01000000 00096 #define PU_JEWELS 0x02000000 00097 #define PU_FLESH 0x04000000 00098 #define PU_CONTAINERS 0x08000000 00099 00100 static unsigned int pmode=0, no_recurse=0; 00101 00109 static void new_menu_pickup(int on, int val) 00110 { 00111 char modestr[128]; 00112 00113 if (no_recurse) return; 00114 00115 if (on) 00116 pmode |= val | PU_NEWMODE; 00117 else 00118 pmode &= ~val; 00119 00120 draw_ext_info(NDI_BLACK, MSG_TYPE_CLIENT, MSG_TYPE_CLIENT_NOTICE, 00121 "To set this pickup mode to a key, use:"); 00122 00123 snprintf(modestr, sizeof(modestr), "bind pickup %u",pmode); 00124 draw_ext_info(NDI_BLACK, MSG_TYPE_CLIENT, MSG_TYPE_CLIENT_NOTICE, modestr); 00125 snprintf(modestr, sizeof(modestr), "pickup %u",pmode); 00126 send_command(modestr, -1, 0); 00127 } 00128 00129 void 00130 on_menu_dont_pickup_activate (GtkMenuItem *menuitem, 00131 gpointer user_data) 00132 { 00133 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_INHIBIT); 00134 } 00135 00136 void 00137 on_menu_stop_before_pickup_activate (GtkMenuItem *menuitem, 00138 gpointer user_data) 00139 { 00140 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_STOP); 00141 } 00142 00143 /*************************************************************************** 00144 * armor pickup options 00145 **************************************************************************/ 00146 00147 void 00148 on_menu_body_armor_activate (GtkMenuItem *menuitem, 00149 gpointer user_data) 00150 { 00151 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_ARMOUR); 00152 } 00153 00154 void 00155 on_menu_boots_activate (GtkMenuItem *menuitem, 00156 gpointer user_data) 00157 { 00158 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_BOOTS); 00159 } 00160 00161 void 00162 on_menu_cloaks_activate (GtkMenuItem *menuitem, 00163 gpointer user_data) 00164 { 00165 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_CLOAK); 00166 } 00167 00168 void 00169 on_menu_gloves_activate (GtkMenuItem *menuitem, 00170 gpointer user_data) 00171 { 00172 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_GLOVES); 00173 } 00174 00175 void 00176 on_menu_helmets_activate (GtkMenuItem *menuitem, 00177 gpointer user_data) 00178 { 00179 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_HELMET); 00180 } 00181 00182 void 00183 on_menu_shields_activate (GtkMenuItem *menuitem, 00184 gpointer user_data) 00185 { 00186 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_SHIELD); 00187 } 00188 00189 /*************************************************************************** 00190 * Books submenu 00191 ****************************************************************************/ 00192 00193 void 00194 on_menu_skillscrolls_activate (GtkMenuItem *menuitem, 00195 gpointer user_data) 00196 { 00197 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_SKILLSCROLL); 00198 } 00199 00200 00201 void 00202 on_menu_normal_book_scrolls_activate (GtkMenuItem *menuitem, 00203 gpointer user_data) 00204 { 00205 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_READABLES); 00206 } 00207 00208 00209 void 00210 on_menu_spellbooks_activate (GtkMenuItem *menuitem, 00211 gpointer user_data) 00212 { 00213 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_SPELLBOOK); 00214 } 00215 00216 /***************************************************************************/ 00217 00218 void 00219 on_menu_drinks_activate (GtkMenuItem *menuitem, 00220 gpointer user_data) 00221 { 00222 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_DRINK); 00223 } 00224 00225 void 00226 on_menu_food_activate (GtkMenuItem *menuitem, 00227 gpointer user_data) 00228 { 00229 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_FOOD); 00230 } 00231 00232 void 00233 on_menu_keys_activate (GtkMenuItem *menuitem, 00234 gpointer user_data) 00235 { 00236 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_KEY); 00237 } 00238 00239 void 00240 on_menu_magical_items_activate (GtkMenuItem *menuitem, 00241 gpointer user_data) 00242 { 00243 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_MAGICAL); 00244 } 00245 00246 void 00247 on_menu_potions_activate (GtkMenuItem *menuitem, 00248 gpointer user_data) 00249 { 00250 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_POTION); 00251 } 00252 00253 void 00254 on_menu_valuables_activate (GtkMenuItem *menuitem, 00255 gpointer user_data) 00256 { 00257 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_VALUABLES); 00258 } 00259 00260 void 00261 on_menu_wands_rods_horns_activate (GtkMenuItem *menuitem, 00262 gpointer user_data) 00263 { 00264 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_MAGIC_DEVICE); 00265 } 00266 00267 void 00268 on_menu_not_cursed_activate (GtkMenuItem *menuitem, 00269 gpointer user_data) 00270 { 00271 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_NOT_CURSED); 00272 } 00273 00274 void 00275 on_menu_jewels_activate (GtkMenuItem *menuitem, 00276 gpointer user_data) 00277 { 00278 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_JEWELS); 00279 } 00280 00281 void 00282 on_menu_containers_activate (GtkMenuItem *menuitem, 00283 gpointer user_data) 00284 { 00285 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_CONTAINERS); 00286 } 00287 00288 void 00289 on_menu_flesh_activate (GtkMenuItem *menuitem, 00290 gpointer user_data) 00291 { 00292 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_FLESH); 00293 } 00294 00295 /*************************************************************************** 00296 * Weapons submenu 00297 ***************************************************************************/ 00298 00299 void 00300 on_menu_all_weapons_activate (GtkMenuItem *menuitem, 00301 gpointer user_data) 00302 { 00303 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_ALLWEAPON); 00304 } 00305 00306 void 00307 on_menu_missile_weapons_activate (GtkMenuItem *menuitem, 00308 gpointer user_data) 00309 { 00310 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_MISSILEWEAPON); 00311 } 00312 00313 void 00314 on_menu_bows_activate (GtkMenuItem *menuitem, 00315 gpointer user_data) 00316 { 00317 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_BOW); 00318 } 00319 00320 void 00321 on_menu_arrows_activate (GtkMenuItem *menuitem, 00322 gpointer user_data) 00323 { 00324 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), PU_ARROW); 00325 } 00326 00327 /*************************************************************************** 00328 * Weight/value submenu 00329 ***************************************************************************/ 00330 00331 void 00332 on_menu_ratio_pickup_off_activate (GtkMenuItem *menuitem, 00333 gpointer user_data) 00334 { 00335 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), 0); 00336 } 00337 00338 void 00339 on_menu_ratio_5_activate (GtkMenuItem *menuitem, 00340 gpointer user_data) 00341 { 00342 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), 1); 00343 } 00344 00345 void 00346 on_menu_ratio_10_activate (GtkMenuItem *menuitem, 00347 gpointer user_data) 00348 { 00349 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), 2); 00350 } 00351 00352 void 00353 on_menu_ratio_15_activate (GtkMenuItem *menuitem, 00354 gpointer user_data) 00355 { 00356 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), 3); 00357 } 00358 00359 void 00360 on_menu_ratio_20_activate (GtkMenuItem *menuitem, 00361 gpointer user_data) 00362 { 00363 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), 4); 00364 } 00365 00366 void 00367 on_menu_ratio_25_activate (GtkMenuItem *menuitem, 00368 gpointer user_data) 00369 { 00370 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), 5); 00371 } 00372 00373 void 00374 on_menu_ratio_30_activate (GtkMenuItem *menuitem, 00375 gpointer user_data) 00376 { 00377 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), 6); 00378 } 00379 00380 void 00381 on_menu_ratio_35_activate (GtkMenuItem *menuitem, 00382 gpointer user_data) 00383 { 00384 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), 7); 00385 } 00386 00387 void 00388 on_menu_ratio_40_activate (GtkMenuItem *menuitem, 00389 gpointer user_data) 00390 { 00391 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), 8); 00392 } 00393 00394 void 00395 on_menu_ratio_45_activate (GtkMenuItem *menuitem, 00396 gpointer user_data) 00397 { 00398 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), 9); 00399 } 00400 00401 void 00402 on_menu_ratio_50_activate (GtkMenuItem *menuitem, 00403 gpointer user_data) 00404 { 00405 new_menu_pickup(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)), 10); 00406 } 00407 00414 void pickup_init(GtkWidget *window_root) 00415 { 00416 static int has_init=0; 00417 GladeXML *xml_tree; 00418 00419 /* 00420 * There isn't really any harm doing this multiple times, but isn't any 00421 * point either. 00422 */ 00423 if (has_init) return; 00424 has_init=1; 00425 00426 /* 00427 * The order here really doesn't make much difference. I suppose order 00428 * could either be in pickup modes (PU_...) or the list of items in the 00429 * menu tree. I chose the later, as easier to make sure all the items are 00430 * accounted for. 00431 * 00432 * In practice, with these values now set up, we could use a single 00433 * function to hande all the events from the menubar instead of the values 00434 * above - that function basically takes the structure that was clicked, 00435 * and finds the value in this array that corresponds to it. But that code 00436 * currently works fine and isn't really outdated, so isn't a big reason to 00437 * change it. 00438 */ 00439 00440 xml_tree = glade_get_widget_tree(GTK_WIDGET(window_root)); 00441 pickup_mapping[num_pickups].menuitem = 00442 glade_xml_get_widget(xml_tree, "do_not_pickup"); 00443 pickup_mapping[num_pickups].pickup_mode = PU_INHIBIT; 00444 num_pickups++; 00445 00446 pickup_mapping[num_pickups].menuitem = 00447 glade_xml_get_widget(xml_tree, "stop_before_pickup"); 00448 pickup_mapping[num_pickups].pickup_mode = PU_STOP; 00449 num_pickups++; 00450 00451 pickup_mapping[num_pickups].menuitem = 00452 glade_xml_get_widget(xml_tree, "body_armor"); 00453 pickup_mapping[num_pickups].pickup_mode = PU_ARMOUR; 00454 num_pickups++; 00455 00456 pickup_mapping[num_pickups].menuitem = 00457 glade_xml_get_widget(xml_tree, "boots"); 00458 pickup_mapping[num_pickups].pickup_mode = PU_BOOTS; 00459 num_pickups++; 00460 00461 pickup_mapping[num_pickups].menuitem = 00462 glade_xml_get_widget(xml_tree, "cloaks"); 00463 pickup_mapping[num_pickups].pickup_mode = PU_CLOAK; 00464 num_pickups++; 00465 00466 pickup_mapping[num_pickups].menuitem = 00467 glade_xml_get_widget(xml_tree, "gloves"); 00468 pickup_mapping[num_pickups].pickup_mode = PU_GLOVES; 00469 num_pickups++; 00470 00471 pickup_mapping[num_pickups].menuitem = 00472 glade_xml_get_widget(xml_tree, "helmets"); 00473 pickup_mapping[num_pickups].pickup_mode = PU_HELMET; 00474 num_pickups++; 00475 00476 pickup_mapping[num_pickups].menuitem = 00477 glade_xml_get_widget(xml_tree, "shields"); 00478 pickup_mapping[num_pickups].pickup_mode = PU_SHIELD; 00479 num_pickups++; 00480 00481 pickup_mapping[num_pickups].menuitem = 00482 glade_xml_get_widget(xml_tree, "skillscrolls"); 00483 pickup_mapping[num_pickups].pickup_mode = PU_SKILLSCROLL; 00484 num_pickups++; 00485 00486 pickup_mapping[num_pickups].menuitem = 00487 glade_xml_get_widget(xml_tree, "normal_book_scrolls"); 00488 pickup_mapping[num_pickups].pickup_mode = PU_READABLES; 00489 num_pickups++; 00490 00491 pickup_mapping[num_pickups].menuitem = 00492 glade_xml_get_widget(xml_tree, "spellbooks"); 00493 pickup_mapping[num_pickups].pickup_mode = PU_SPELLBOOK; 00494 num_pickups++; 00495 00496 pickup_mapping[num_pickups].menuitem = 00497 glade_xml_get_widget(xml_tree, "drinks"); 00498 pickup_mapping[num_pickups].pickup_mode = PU_DRINK; 00499 num_pickups++; 00500 00501 pickup_mapping[num_pickups].menuitem = 00502 glade_xml_get_widget(xml_tree, "food"); 00503 pickup_mapping[num_pickups].pickup_mode = PU_FOOD; 00504 num_pickups++; 00505 00506 pickup_mapping[num_pickups].menuitem = 00507 glade_xml_get_widget(xml_tree, "flesh"); 00508 pickup_mapping[num_pickups].pickup_mode = PU_FLESH; 00509 num_pickups++; 00510 00511 pickup_mapping[num_pickups].menuitem = 00512 glade_xml_get_widget(xml_tree, "keys"); 00513 pickup_mapping[num_pickups].pickup_mode = PU_KEY; 00514 num_pickups++; 00515 00516 pickup_mapping[num_pickups].menuitem = 00517 glade_xml_get_widget(xml_tree, "magical_items"); 00518 pickup_mapping[num_pickups].pickup_mode = PU_MAGICAL; 00519 num_pickups++; 00520 00521 pickup_mapping[num_pickups].menuitem = 00522 glade_xml_get_widget(xml_tree, "potions"); 00523 pickup_mapping[num_pickups].pickup_mode = PU_POTION; 00524 num_pickups++; 00525 00526 pickup_mapping[num_pickups].menuitem = 00527 glade_xml_get_widget(xml_tree, "valuables"); 00528 pickup_mapping[num_pickups].pickup_mode = PU_VALUABLES; 00529 num_pickups++; 00530 00531 pickup_mapping[num_pickups].menuitem = 00532 glade_xml_get_widget(xml_tree, "wands_rods_horns"); 00533 pickup_mapping[num_pickups].pickup_mode = PU_MAGIC_DEVICE; 00534 num_pickups++; 00535 00536 pickup_mapping[num_pickups].menuitem = 00537 glade_xml_get_widget(xml_tree, "jewels"); 00538 pickup_mapping[num_pickups].pickup_mode = PU_JEWELS; 00539 num_pickups++; 00540 00541 pickup_mapping[num_pickups].menuitem = 00542 glade_xml_get_widget(xml_tree, "containers"); 00543 pickup_mapping[num_pickups].pickup_mode = PU_CONTAINERS; 00544 num_pickups++; 00545 00546 pickup_mapping[num_pickups].menuitem = 00547 glade_xml_get_widget(xml_tree, "all_weapons"); 00548 pickup_mapping[num_pickups].pickup_mode = PU_ALLWEAPON; 00549 num_pickups++; 00550 00551 pickup_mapping[num_pickups].menuitem = 00552 glade_xml_get_widget(xml_tree, "missile_weapons"); 00553 pickup_mapping[num_pickups].pickup_mode = PU_MISSILEWEAPON; 00554 num_pickups++; 00555 00556 pickup_mapping[num_pickups].menuitem = 00557 glade_xml_get_widget(xml_tree, "bows"); 00558 pickup_mapping[num_pickups].pickup_mode = PU_BOW; 00559 num_pickups++; 00560 00561 pickup_mapping[num_pickups].menuitem = 00562 glade_xml_get_widget(xml_tree, "arrows"); 00563 pickup_mapping[num_pickups].pickup_mode = PU_ARROW; 00564 num_pickups++; 00565 00566 pickup_mapping[num_pickups].menuitem = 00567 glade_xml_get_widget(xml_tree, "ratio_pickup_off"); 00568 pickup_mapping[num_pickups].pickup_mode = ~PU_RATIO; 00569 num_pickups++; 00570 00571 pickup_mapping[num_pickups].menuitem = 00572 glade_xml_get_widget(xml_tree, "ratio_5"); 00573 pickup_mapping[num_pickups].pickup_mode = 1; 00574 num_pickups++; 00575 00576 pickup_mapping[num_pickups].menuitem = 00577 glade_xml_get_widget(xml_tree, "ratio_10"); 00578 pickup_mapping[num_pickups].pickup_mode = 2; 00579 num_pickups++; 00580 00581 pickup_mapping[num_pickups].menuitem = 00582 glade_xml_get_widget(xml_tree, "ratio_15"); 00583 pickup_mapping[num_pickups].pickup_mode = 3; 00584 num_pickups++; 00585 00586 pickup_mapping[num_pickups].menuitem = 00587 glade_xml_get_widget(xml_tree, "ratio_20"); 00588 pickup_mapping[num_pickups].pickup_mode = 4; 00589 num_pickups++; 00590 00591 pickup_mapping[num_pickups].menuitem = 00592 glade_xml_get_widget(xml_tree, "ratio_25"); 00593 pickup_mapping[num_pickups].pickup_mode = 5; 00594 num_pickups++; 00595 00596 pickup_mapping[num_pickups].menuitem = 00597 glade_xml_get_widget(xml_tree, "ratio_30"); 00598 pickup_mapping[num_pickups].pickup_mode = 6; 00599 num_pickups++; 00600 00601 pickup_mapping[num_pickups].menuitem = 00602 glade_xml_get_widget(xml_tree, "ratio_35"); 00603 pickup_mapping[num_pickups].pickup_mode = 7; 00604 num_pickups++; 00605 00606 pickup_mapping[num_pickups].menuitem = 00607 glade_xml_get_widget(xml_tree, "ratio_40"); 00608 pickup_mapping[num_pickups].pickup_mode = 8; 00609 num_pickups++; 00610 00611 pickup_mapping[num_pickups].menuitem = 00612 glade_xml_get_widget(xml_tree, "ratio_45"); 00613 pickup_mapping[num_pickups].pickup_mode = 9; 00614 num_pickups++; 00615 00616 pickup_mapping[num_pickups].menuitem = 00617 glade_xml_get_widget(xml_tree, "ratio_50"); 00618 pickup_mapping[num_pickups].pickup_mode = 10; 00619 num_pickups++; 00620 00621 pickup_mapping[num_pickups].menuitem = 00622 glade_xml_get_widget(xml_tree, "not_cursed"); 00623 pickup_mapping[num_pickups].pickup_mode = PU_NOT_CURSED; 00624 num_pickups++; 00625 00626 /* 00627 * Do some bounds checking. We could actually set this exactly right, 00628 * since additional menu entries are not likely to be added often. We exit 00629 * because if we overrun that structure, we've screwed up memory and will 00630 * likely crash or otherwise have odd behaviour. 00631 */ 00632 if (num_pickups>=MAX_PICKUPS) { 00633 LOG(LOG_ERROR, "pickup.c::pickup_init", "num_pickups (%d) >= MAX_PICKUPS (%d)\n", 00634 num_pickups, MAX_PICKUPS); 00635 exit(1); 00636 } 00637 00638 } 00639 00643 void client_pickup(uint32 pickup) 00644 { 00645 int i; 00646 00647 /* 00648 * no_recurse is used to limit callbacks - otherwise what happens is when 00649 * we call set_active below, it emits the appropriate signal, which results 00650 * in new_menu_pickup() getting called, which then sends a new pickup 00651 * command to the server, which then results in server sending data to 00652 * client, etc. 00653 */ 00654 no_recurse=1; 00655 pmode=pickup; 00656 00657 for (i=0; i < num_pickups; i++) { 00658 if ((pickup & ~PU_RATIO) & pickup_mapping[i].pickup_mode || 00659 (pickup & PU_RATIO) == pickup_mapping[i].pickup_mode) { 00660 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pickup_mapping[i].menuitem), 1); 00661 } else { 00662 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pickup_mapping[i].menuitem), 0); 00663 } 00664 } 00665 no_recurse=0; 00666 }
1.7.6.1