Crossfire Client, Trunk  R18666
/home/leaf/crossfire/client/trunk/gtk-v2/src/pickup.c
Go to the documentation of this file.
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 }