diff -urN source.orig/abl-show.cc source/abl-show.cc
--- source.orig/abl-show.cc	2008-08-01 02:00:50.000000000 +0300
+++ source/abl-show.cc	2008-09-10 01:58:55.000000000 +0300
@@ -1024,14 +1024,14 @@
     // (Happens at 100, losing consciousness possible from 500 downward.)
     if (hungerCheck && you.species != SP_VAMPIRE)
     {
-        const int expected_hunger = you.hunger - abil.food_cost * 2;
+        const int expected_hunger = you.hunger - abil.food_cost * 2 * 10;
 #ifdef DEBUG_DIAGNOSTICS
         mprf(MSGCH_DIAGNOSTICS,
              "hunger: %d, max. food_cost: %d, expected hunger: %d",
-             you.hunger, abil.food_cost * 2, expected_hunger);
+             you.hunger, abil.food_cost * 2 * 10, expected_hunger);
 #endif
         // Safety margin for natural hunger, mutations etc.
-        if (expected_hunger <= 150)
+        if (expected_hunger <= 1500)
         {
             mpr("You're too hungry.");
             crawl_state.zero_turns_taken();
@@ -1942,7 +1942,7 @@
     }
 
     if (food_cost)
-        make_hungry( food_cost, false, true );
+        make_hungry( food_cost * 10, false, true );
 
     if (piety_cost)
         lose_piety( piety_cost );
diff -urN source.orig/acr.cc source/acr.cc
--- source.orig/acr.cc	2008-08-01 02:01:03.000000000 +0300
+++ source/acr.cc	2008-09-10 01:58:55.000000000 +0300
@@ -193,6 +193,8 @@
 static void _take_starting_note();
 static void _startup_tutorial();
 
+static void _hunger_rate_message();
+
 #ifdef DGL_SIMPLE_MESSAGING
 static void _read_messages();
 #endif
@@ -263,6 +265,7 @@
     if (game_start && you.char_class == JOB_WANDERER)
         _wanderer_startup_message();
 
+    _hunger_rate_message();
     _god_greeting_message( game_start );
 
     // Warn player about their weapon, if unsuitable.
@@ -337,6 +340,12 @@
     }
 }
 
+static void _hunger_rate_message()
+{
+    mprf("Your hunger rate is set to %d and spell hunger %d percent.",
+        Options.hunger_rate_percent, Options.spell_hunger_percent);
+}
+
 static void _god_greeting_message( bool game_start )
 {
     switch (you.religion)
@@ -2890,10 +2899,10 @@
             slow_player( dur );
         }
 
-        make_hungry(700, true);
+        make_hungry(7000, true);
 
-        if (you.hunger < 50)
-            you.hunger = 50;
+        if (you.hunger < 500)
+            you.hunger = 500;
 
         calc_hp();
 
@@ -3136,7 +3145,7 @@
 
     const int food_use = player_hunger_rate();
 
-    if (food_use > 0 && you.hunger >= 40)
+    if (food_use > 0 && you.hunger >= 400)
         make_hungry( food_use, true );
 
     // XXX: using an int tmp to fix the fact that hit_points_regeneration
@@ -3667,7 +3676,7 @@
     else
     {
         mpr("You swing at nothing.");
-        make_hungry(3, true);
+        make_hungry(30, true);
         you.turn_is_over = true;
     }
 }
diff -urN source.orig/chardump.cc source/chardump.cc
--- source.orig/chardump.cc	2008-08-01 02:00:51.000000000 +0300
+++ source/chardump.cc	2008-09-10 01:58:55.000000000 +0300
@@ -1112,13 +1112,13 @@
 {
     const bool vamp = (you.species == SP_VAMPIRE);
 
-    return ((you.hunger <= 1000) ? (vamp ? "bloodless" : "starving") :
-            (you.hunger <= 1533) ? (vamp ? "near bloodless" : "near starving") :
-            (you.hunger <= 2066) ? (vamp ? "very thirsty" : "very hungry") :
-            (you.hunger <= 2600) ? (vamp ? "thirsty" : "hungry") :
-            (you.hunger <  7000) ? (vamp ? "not thirsty" : "not hungry") :
-            (you.hunger <  9000) ? "full" :
-            (you.hunger < 11000) ? "very full"
+    return ((you.hunger <= 10000) ? (vamp ? "bloodless" : "starving") :
+            (you.hunger <= 15330) ? (vamp ? "near bloodless" : "near starving") :
+            (you.hunger <= 20660) ? (vamp ? "very thirsty" : "very hungry") :
+            (you.hunger <= 26000) ? (vamp ? "thirsty" : "hungry") :
+            (you.hunger <  70000) ? (vamp ? "not thirsty" : "not hungry") :
+            (you.hunger <  90000) ? "full" :
+            (you.hunger < 110000) ? "very full"
                                  : (vamp ? "almost alive" : "completely stuffed"));
 }
 
diff -urN source.orig/delay.cc source/delay.cc
--- source.orig/delay.cc	2008-08-01 02:00:57.000000000 +0300
+++ source/delay.cc	2008-09-10 01:58:55.000000000 +0300
@@ -645,11 +645,11 @@
 // more amused the hungrier you are.
 static void _xom_check_corpse_waste()
 {
-    int food_need = 7000 - you.hunger;
+    int food_need = 70000 - you.hunger;
     if (food_need < 0)
         food_need = 0;
 
-    xom_is_stimulated(64 + (191 * food_need / 6000));
+    xom_is_stimulated(64 + (191 * food_need / 60000));
 }
 
 void handle_delay( void )
diff -urN source.orig/externs.h source/externs.h
--- source.orig/externs.h	2008-08-01 02:00:56.000000000 +0300
+++ source/externs.h	2008-09-10 01:58:55.000000000 +0300
@@ -591,7 +591,7 @@
   int prev_move_x;
   int prev_move_y;
 
-  int hunger;
+  long hunger;
   FixedVector<char, NUM_EQUIP> equip;
 
   int hp;
@@ -1711,6 +1711,9 @@
 
     int         num_colours;     // used for setting up curses colour table (8 or 16)
 
+    int         spell_hunger_percent;
+    int         hunger_rate_percent;
+
 #ifdef WIZARD
     int         wiz_mode;        // yes, no, never in wiz mode to start
 #endif
diff -urN source.orig/fight.cc source/fight.cc
--- source.orig/fight.cc	2008-08-01 02:01:01.000000000 +0300
+++ source/fight.cc	2008-09-10 01:58:55.000000000 +0300
@@ -544,7 +544,7 @@
     }
 
     // The attacker loses nutrition.
-    attacker->make_hungry(3, true);
+    attacker->make_hungry(30, true);
 
     check_special_wield_effects();
 
@@ -768,7 +768,7 @@
         if (you.attribute[ATTR_TRANSFORMATION] == TRAN_BAT)
             food_value /= 2;
 
-        lessen_hunger(food_value, false);
+        lessen_hunger(food_value*10, false);
     }
 
     did_god_conduct(DID_DRINK_BLOOD, 5 + random2(4));
@@ -1150,7 +1150,7 @@
         to_hit = random2( calc_your_to_hit_unarmed(uattack,
                           damage_brand == SPWPN_VAMPIRICISM) );
 
-        make_hungry(2, true);
+        make_hungry(20, true);
 
         alert_nearby_monsters();
 
@@ -1833,7 +1833,7 @@
             inc_hp(heal, false);
 
             if (you.hunger_state != HS_ENGORGED)
-                lessen_hunger(30 + random2avg(59, 2), false);
+                lessen_hunger(300 + random2avg(590, 2), false);
 
             did_god_conduct(DID_NECROMANCY, 2);
         }
@@ -2313,7 +2313,7 @@
         attacker->heal(hp_boost);
 
         if (attacker->hunger_level() != HS_ENGORGED)
-            attacker->make_hungry(-random2avg(59, 2));
+            attacker->make_hungry(-random2avg(590, 2));
 
         attacker->god_conduct(DID_NECROMANCY, 2);
         break;
@@ -3761,7 +3761,7 @@
             break;
 
         if (one_chance_in(20) || (damage_done > 0 && coinflip()))
-            defender->make_hungry(400, false);
+            defender->make_hungry(4000, false);
         break;
 
     case AF_BLINK:
diff -urN source.orig/food.cc source/food.cc
--- source.orig/food.cc	2008-08-01 02:00:55.000000000 +0300
+++ source/food.cc	2008-09-10 01:58:55.000000000 +0300
@@ -104,8 +104,8 @@
 
     you.hunger += satiated_amount;
 
-    if (you.hunger > 12000)
-        you.hunger = 12000;
+    if (you.hunger > 120000)
+        you.hunger = 120000;
 
     // So we don't get two messages, ever.
     bool state_message = _food_change(false);
@@ -817,7 +817,7 @@
         return (false);
     }
 
-    if (you.hunger >= 11000)
+    if (you.hunger >= 110000)
     {
         mprf("You're too full to %s anything.",
              you.species == SP_VAMPIRE ? "drain" : "eat");
@@ -926,19 +926,19 @@
     you.hunger = std::min(you_max_hunger(), you.hunger);
 
     // get new hunger state
-    if (you.hunger <= 1000)
+    if (you.hunger <= 10000)
         newstate = HS_STARVING;
-    else if (you.hunger <= 1533)
+    else if (you.hunger <= 15330)
         newstate = HS_NEAR_STARVING;
-    else if (you.hunger <= 2066)
+    else if (you.hunger <= 20660)
         newstate = HS_VERY_HUNGRY;
-    else if (you.hunger <= 2600)
+    else if (you.hunger <= 26000)
         newstate = HS_HUNGRY;
-    else if (you.hunger < 7000)
+    else if (you.hunger < 70000)
         newstate = HS_SATIATED;
-    else if (you.hunger < 9000)
+    else if (you.hunger < 90000)
         newstate = HS_FULL;
-    else if (you.hunger < 11000)
+    else if (you.hunger < 110000)
         newstate = HS_VERY_FULL;
 
     if (newstate != you.hunger_state)
@@ -1055,11 +1055,11 @@
     if (magnitude == 0)
         return;
 
-    if (magnitude <= 100)
+    if (magnitude <= 1000)
         msg = "You feel slightly ";
-    else if (magnitude <= 350)
+    else if (magnitude <= 3500)
         msg = "You feel somewhat ";
-    else if (magnitude <= 800)
+    else if (magnitude <= 8000)
         msg = "You feel quite a bit ";
     else
         msg = "You feel a lot ";
@@ -1465,47 +1465,47 @@
         {
         case FOOD_MEAT_RATION:
         case FOOD_ROYAL_JELLY:
-            food_value = 5000;
+            food_value = 50000;
             break;
         case FOOD_BREAD_RATION:
-            food_value = 4400;
+            food_value = 44000;
             break;
         case FOOD_HONEYCOMB:
-            food_value = 2000;
+            food_value = 20000;
             break;
         case FOOD_SNOZZCUMBER:  // Maybe a nasty side-effect from RD's book?
                                 // I'd like that, but I don't dare. (jpeg)
         case FOOD_PIZZA:
         case FOOD_BEEF_JERKY:
-            food_value = 1500;
+            food_value = 15000;
             break;
         case FOOD_CHEESE:
         case FOOD_SAUSAGE:
-            food_value = 1200;
+            food_value = 12000;
             break;
         case FOOD_ORANGE:
         case FOOD_BANANA:
         case FOOD_LEMON:
-            food_value = 1000;
+            food_value = 10000;
             break;
         case FOOD_PEAR:
         case FOOD_APPLE:
         case FOOD_APRICOT:
-            food_value = 700;
+            food_value = 7000;
             break;
         case FOOD_CHOKO:
         case FOOD_RAMBUTAN:
         case FOOD_LYCHEE:
-            food_value = 600;
+            food_value = 6000;
             break;
         case FOOD_STRAWBERRY:
-            food_value = 200;
+            food_value = 2000;
             break;
         case FOOD_GRAPE:
-            food_value = 100;
+            food_value = 1000;
             break;
         case FOOD_SULTANA:
-            food_value = 70;     // will not save you from starvation
+            food_value = 700;     // will not save you from starvation
             break;
         default:
             break;
@@ -1515,23 +1515,23 @@
         switch (item_type)
         {
         case FOOD_MEAT_RATION:
-            carnivore_modifier = 500;
-            herbivore_modifier = -1500;
+            carnivore_modifier = 5000;
+            herbivore_modifier = -15000;
             break;
         case FOOD_BEEF_JERKY:
         case FOOD_SAUSAGE:
-            carnivore_modifier = 200;
-            herbivore_modifier = -200;
+            carnivore_modifier = 2000;
+            herbivore_modifier = -2000;
             break;
         case FOOD_BREAD_RATION:
-            carnivore_modifier = -1000;
-            herbivore_modifier = 500;
+            carnivore_modifier = -10000;
+            herbivore_modifier = 5000;
             break;
         case FOOD_BANANA:
         case FOOD_ORANGE:
         case FOOD_LEMON:
-            carnivore_modifier = -300;
-            herbivore_modifier = 300;
+            carnivore_modifier = -3000;
+            herbivore_modifier = 3000;
             break;
         case FOOD_PEAR:
         case FOOD_APPLE:
@@ -1540,17 +1540,17 @@
         case FOOD_SNOZZCUMBER:
         case FOOD_RAMBUTAN:
         case FOOD_LYCHEE:
-            carnivore_modifier = -200;
-            herbivore_modifier = 200;
+            carnivore_modifier = -2000;
+            herbivore_modifier = 2000;
             break;
         case FOOD_STRAWBERRY:
-            carnivore_modifier = -50;
-            herbivore_modifier = 50;
+            carnivore_modifier = -500;
+            herbivore_modifier = 500;
             break;
         case FOOD_GRAPE:
         case FOOD_SULTANA:
-            carnivore_modifier = -20;
-            herbivore_modifier = 20;
+            carnivore_modifier = -200;
+            herbivore_modifier = 200;
             break;
         default:
             carnivore_modifier = 0;
@@ -1886,7 +1886,7 @@
     }
 
     if (!end_feeding)
-        lessen_hunger(food_value / duration, !start_feeding);
+        lessen_hunger((food_value / duration) * 10, !start_feeding);
 }
 
 // Returns true if a food item (also corpses) is poisonous AND the player
@@ -2044,7 +2044,7 @@
         return (false);
     }
 
-    if (check_hunger && you.hunger >= 11000)
+    if (check_hunger && you.hunger >= 110000)
     {
         if (!suppress_msg)
             mpr("You're too full to eat anything.");
@@ -2376,28 +2376,28 @@
     calc_mp();
 }
 
-int you_max_hunger()
+long you_max_hunger()
 {
     // This case shouldn't actually happen.
     if (you.is_undead == US_UNDEAD)
-        return 6000;
+        return 60000;
 
     // Take care of ghouls - they can never be 'full'.
     if (you.species == SP_GHOUL)
-        return 6999;
+        return 69990;
 
-    return 40000;
+    return 400000;
 }
 
-int you_min_hunger()
+long you_min_hunger()
 {
     // This case shouldn't actually happen.
     if (you.is_undead == US_UNDEAD)
-        return 6000;
+        return 60000;
 
     // Vampires can never starve to death.
     if (you.species == SP_VAMPIRE)
-        return 701;
+        return 7010;
 
     return 0;
 }
diff -urN source.orig/food.h source/food.h
--- source.orig/food.h	2008-08-01 02:01:03.000000000 +0300
+++ source/food.h	2008-09-10 01:58:55.000000000 +0300
@@ -108,7 +108,7 @@
 
 void finished_eating_message(int food_type);
 
-int you_max_hunger();
-int you_min_hunger();
+long you_max_hunger();
+long you_min_hunger();
 
 #endif
diff -urN source.orig/initfile.cc source/initfile.cc
--- source.orig/initfile.cc	2008-08-01 02:00:59.000000000 +0300
+++ source/initfile.cc	2008-09-10 01:58:55.000000000 +0300
@@ -800,6 +800,10 @@
 
     item_stack_summary_minimum = 5;
 
+    // Normal hungering by default
+    spell_hunger_percent = 100;
+    hunger_rate_percent  = 100;
+
 #ifdef WIZARD
     fsim_rounds = 40000L;
     fsim_mons   = "worm";
@@ -2243,6 +2247,26 @@
                      field.c_str() );
         }
     }
+    else if (key == "hunger_rate_percent")
+    {
+        hunger_rate_percent = atoi( field.c_str() );
+        if (hunger_rate_percent < 0 || hunger_rate_percent > 1000)
+        {
+            hunger_rate_percent = 100;
+            fprintf( stderr, "Bad hunger rate percentage -- %s\n",
+                     field.c_str() );
+        }
+    }
+    else if (key == "spell_hunger_percent")
+    {
+        spell_hunger_percent = atoi( field.c_str() );
+        if (spell_hunger_percent < 0 || spell_hunger_percent > 1000)
+        {
+            spell_hunger_percent = 100;
+            fprintf( stderr, "Bad spell hunger percentage -- %s\n",
+                     field.c_str() );
+        }
+    }
     // If DATA_DIR_PATH is set, don't set crawl_dir from .crawlrc.
 #ifndef DATA_DIR_PATH
     else if (key == "crawl_dir")
diff -urN source.orig/itemprop.cc source/itemprop.cc
--- source.orig/itemprop.cc	2008-08-01 02:00:48.000000000 +0300
+++ source/itemprop.cc	2008-09-10 01:58:55.000000000 +0300
@@ -388,7 +388,7 @@
 {
     int         id;
     const char *name;
-    int         value;
+    long        value;
     int         carn_mod;
     int         herb_mod;
     int         mass;
@@ -403,30 +403,30 @@
 static int Food_index[NUM_FOODS];
 static food_def Food_prop[NUM_FOODS] =
 {
-    { FOOD_MEAT_RATION,  "meat ration",  5000,   500, -1500,  80, 4 },
-    { FOOD_SAUSAGE,      "sausage",      1500,   150,  -400,  40, 1 },
-    { FOOD_CHUNK,        "chunk",        1000,   100,  -500, 100, 3 },
-    { FOOD_BEEF_JERKY,   "beef jerky",    800,   100,  -250,  20, 1 },
-
-    { FOOD_BREAD_RATION, "bread ration", 4400, -1500,   750,  80, 4 },
-    { FOOD_SNOZZCUMBER,  "snozzcumber",  1500,  -500,   500,  50, 1 },
-    { FOOD_ORANGE,       "orange",       1000,  -350,   400,  20, 1 },
-    { FOOD_BANANA,       "banana",       1000,  -350,   400,  20, 1 },
-    { FOOD_LEMON,        "lemon",        1000,  -350,   400,  20, 1 },
-    { FOOD_PEAR,         "pear",          700,  -250,   300,  20, 1 },
-    { FOOD_APPLE,        "apple",         700,  -250,   300,  20, 1 },
-    { FOOD_APRICOT,      "apricot",       700,  -250,   300,  15, 1 },
-    { FOOD_CHOKO,        "choko",         600,  -200,   250,  30, 1 },
-    { FOOD_RAMBUTAN,     "rambutan",      600,  -200,   250,  10, 1 },
-    { FOOD_LYCHEE,       "lychee",        600,  -200,   250,  10, 1 },
-    { FOOD_STRAWBERRY,   "strawberry",    200,   -80,   100,   5, 1 },
-    { FOOD_GRAPE,        "grape",         100,   -40,    50,   2, 1 },
-    { FOOD_SULTANA,      "sultana",        70,   -30,    30,   1, 1 },
-
-    { FOOD_ROYAL_JELLY,  "royal jelly",  4000,     0,     0,  55, 1 },
-    { FOOD_HONEYCOMB,    "honeycomb",    2000,     0,     0,  40, 1 },
-    { FOOD_PIZZA,        "pizza",        1500,     0,     0,  40, 1 },
-    { FOOD_CHEESE,       "cheese",       1200,     0,     0,  40, 1 },
+    { FOOD_MEAT_RATION,  "meat ration",  50000,   5000, -15000,  80, 4 },
+    { FOOD_SAUSAGE,      "sausage",      15000,   1500,  -4000,  40, 1 },
+    { FOOD_CHUNK,        "chunk",        10000,   1000,  -5000, 100, 3 },
+    { FOOD_BEEF_JERKY,   "beef jerky",    8000,   1000,  -2500,  20, 1 },
+
+    { FOOD_BREAD_RATION, "bread ration", 44000, -15000,   7500,  80, 4 },
+    { FOOD_SNOZZCUMBER,  "snozzcumber",  15000,  -5000,   5000,  50, 1 },
+    { FOOD_ORANGE,       "orange",       10000,  -3500,   4000,  20, 1 },
+    { FOOD_BANANA,       "banana",       10000,  -3500,   4000,  20, 1 },
+    { FOOD_LEMON,        "lemon",        10000,  -3500,   4000,  20, 1 },
+    { FOOD_PEAR,         "pear",          7000,  -2500,   3000,  20, 1 },
+    { FOOD_APPLE,        "apple",         7000,  -2500,   3000,  20, 1 },
+    { FOOD_APRICOT,      "apricot",       7000,  -2500,   3000,  15, 1 },
+    { FOOD_CHOKO,        "choko",         6000,  -2000,   2500,  30, 1 },
+    { FOOD_RAMBUTAN,     "rambutan",      6000,  -2000,   2500,  10, 1 },
+    { FOOD_LYCHEE,       "lychee",        6000,  -2000,   2500,  10, 1 },
+    { FOOD_STRAWBERRY,   "strawberry",    2000,   -800,   1000,   5, 1 },
+    { FOOD_GRAPE,        "grape",         1000,   -400,    500,   2, 1 },
+    { FOOD_SULTANA,      "sultana",        700,   -300,    300,   1, 1 },
+
+    { FOOD_ROYAL_JELLY,  "royal jelly",  40000,      0,      0,  55, 1 },
+    { FOOD_HONEYCOMB,    "honeycomb",    20000,      0,      0,  40, 1 },
+    { FOOD_PIZZA,        "pizza",        15000,      0,      0,  40, 1 },
+    { FOOD_CHEESE,       "cheese",       12000,      0,      0,  40, 1 },
 };
 
 // Must call this functions early on so that the above tables can
diff -urN source.orig/item_use.cc source/item_use.cc
--- source.orig/item_use.cc	2008-08-01 02:00:47.000000000 +0300
+++ source/item_use.cc	2008-09-10 01:58:55.000000000 +0300
@@ -3711,7 +3711,7 @@
     you.turn_is_over = true;
 
     if (you.species != SP_VAMPIRE)
-        lessen_hunger(40, true);
+        lessen_hunger(400, true);
 }                               // end drink()
 
 bool _drink_fountain()
diff -urN source.orig/it_use2.cc source/it_use2.cc
--- source.orig/it_use2.cc	2008-08-01 02:00:59.000000000 +0300
+++ source/it_use2.cc	2008-09-10 01:58:55.000000000 +0300
@@ -98,7 +98,7 @@
             else // coagulated
                 mpr("This tastes delicious!");
 
-            lessen_hunger(1000, true);
+            lessen_hunger(10000, true);
 
             // healing depends on thirst
             if (you.hunger_state < HS_SATIATED) // !heal wounds
@@ -121,13 +121,13 @@
             {
                 // Likes it
                 mpr("This tastes like blood.");
-                lessen_hunger(200, true);
+                lessen_hunger(2000, true);
             }
             else
             {
                 mpr("Blech - this tastes like blood!");
                 if (!player_mutation_level(MUT_HERBIVOROUS) && one_chance_in(3))
-                    lessen_hunger(100, true);
+                    lessen_hunger(1000, true);
                 else
                 {
                     disease_player( 50 + random2(100) );
@@ -259,7 +259,7 @@
         else
         {
             mpr("That potion was really gluggy!");
-            lessen_hunger(6000, true);
+            lessen_hunger(60000, true);
         }
         break;
 
@@ -286,7 +286,7 @@
         else
         {
             mpr("This tastes like water.");
-            lessen_hunger(20, true);
+            lessen_hunger(200, true);
         }
         break;
 
@@ -336,7 +336,7 @@
         if (you.species == SP_VAMPIRE && you.hunger_state <= HS_SATIATED)
         {
             mpr("You feel slightly irritated.");
-            make_hungry(100, false);
+            make_hungry(1000, false);
         }
         else if (you.duration[DUR_BUILDING_RAGE])
         {
diff -urN source.orig/it_use3.cc source/it_use3.cc
--- source.orig/it_use3.cc	2008-08-01 02:00:47.000000000 +0300
+++ source/it_use3.cc	2008-09-10 01:58:55.000000000 +0300
@@ -481,7 +481,7 @@
 
                 dec_hp( 5 + random2avg(19, 2), false, "Staff of Dispater" );
                 dec_mp( 2 + random2avg(5, 2) );
-                make_hungry(100, false, true);
+                make_hungry(1000, false, true);
 
                 power = you.skills[SK_EVOCATIONS] * 8;
                 your_spells( SPELL_HELLFIRE, power, false );
@@ -492,7 +492,7 @@
             case SPWPN_SCEPTRE_OF_ASMODEUS:
                 if (evoke_sceptre_of_asmodeus())
                 {
-                    make_hungry(200, false, true);
+                    make_hungry(2000, false, true);
                     did_work = true;
                     pract = 1;
                 }
@@ -506,7 +506,7 @@
                 }
 
                 dec_mp(4);
-                make_hungry(50, false, true);
+                make_hungry(500, false, true);
                 pract = 1;
                 did_work = true;
 
@@ -528,7 +528,7 @@
                 mpr("Magical energy flows into your mind!");
 
                 inc_mp( 3 + random2(5) + you.skills[SK_EVOCATIONS] / 3, false );
-                make_hungry(50, false, true);
+                make_hungry(500, false, true);
                 pract = 1;
                 did_work = true;
 
@@ -567,7 +567,7 @@
             {
                 mpr("You channel some magical energy.");
                 inc_mp( 1 + random2(3), false );
-                make_hungry(50, false, true);
+                make_hungry(500, false, true);
                 pract = (one_chance_in(5) ? 1 : 0);
                 did_work = true;
 
diff -urN source.orig/player.cc source/player.cc
--- source.orig/player.cc	2008-08-01 02:00:56.000000000 +0300
+++ source/player.cc	2008-09-10 01:58:55.000000000 +0300
@@ -1031,10 +1031,10 @@
 
 int player_hunger_rate(void)
 {
-    int hunger = 3;
+    int hunger = 30;
 
     if (you.attribute[ATTR_TRANSFORMATION] == TRAN_BAT)
-        return 1;
+        return 10;
 
     // jmf: Hunger isn't fair while you can't eat.
     // Actually, it is since you can detransform any time you like -- bwr
@@ -1042,20 +1042,20 @@
         return 0;
 
     if (you.species == SP_TROLL)
-        hunger += 3;            // in addition to the +3 for fast metabolism
+        hunger += 30;            // in addition to the +3 for fast metabolism
 
     if (you.duration[DUR_REGENERATION] > 0)
-        hunger += 4;
+        hunger += 40;
 
     // Moved here from acr.cc... maintaining the >= 40 behaviour.
-    if (you.hunger >= 40)
+    if (you.hunger >= 400)
     {
         if (you.duration[DUR_INVIS] > 0)
-            hunger += 5;
+            hunger += 50;
 
         // Berserk has its own food penalty -- excluding berserk haste.
         if (you.duration[DUR_HASTE] > 0 && !you.duration[DUR_BERSERKER])
-            hunger += 5;
+            hunger += 50;
     }
 
     if (you.species == SP_VAMPIRE)
@@ -1064,62 +1064,67 @@
         {
         case HS_STARVING:
         case HS_NEAR_STARVING:
-            hunger -= 3;
+            hunger -= 30;
             break;
         case HS_VERY_HUNGRY:
-            hunger -= 2;
+            hunger -= 20;
             break;
         case HS_HUNGRY:
-            hunger--;
+            hunger -= 10;
             break;
         case HS_SATIATED:
             break;
         case HS_FULL:
-            hunger++;
+            hunger += 10;
             break;
         case HS_VERY_FULL:
-            hunger += 2;
+            hunger += 20;
             break;
         case HS_ENGORGED:
-            hunger += 3;
+            hunger += 30;
         }
     }
     else
     {
-        hunger += player_mutation_level(MUT_FAST_METABOLISM);
+        hunger += player_mutation_level(MUT_FAST_METABOLISM) * 10;
 
         if (player_mutation_level(MUT_SLOW_METABOLISM) > 2)
-            hunger -= 2;
+            hunger -= 20;
         else if (player_mutation_level(MUT_SLOW_METABOLISM) > 0)
-            hunger--;
+            hunger -= 10;
     }
 
     // rings
-    hunger += 2 * player_equip( EQ_RINGS, RING_REGENERATION );
-    hunger += 4 * player_equip( EQ_RINGS, RING_HUNGER );
-    hunger -= 2 * player_equip( EQ_RINGS, RING_SUSTENANCE );
+    hunger += 20 * player_equip( EQ_RINGS, RING_REGENERATION );
+    hunger += 40 * player_equip( EQ_RINGS, RING_HUNGER );
+    hunger -= 20 * player_equip( EQ_RINGS, RING_SUSTENANCE );
 
     // weapon ego types
     if (you.species != SP_VAMPIRE)
     {
-        hunger += 6 * player_equip_ego_type( EQ_WEAPON, SPWPN_VAMPIRICISM );
-        hunger += 9 * player_equip_ego_type( EQ_WEAPON, SPWPN_VAMPIRES_TOOTH );
+        hunger += 60 * player_equip_ego_type( EQ_WEAPON, SPWPN_VAMPIRICISM );
+        hunger += 90 * player_equip_ego_type( EQ_WEAPON, SPWPN_VAMPIRES_TOOTH );
     }
     else
     {
-        hunger += 1 * player_equip_ego_type( EQ_WEAPON, SPWPN_VAMPIRICISM );
-        hunger += 2 * player_equip_ego_type( EQ_WEAPON, SPWPN_VAMPIRES_TOOTH );
+        hunger += 10 * player_equip_ego_type( EQ_WEAPON, SPWPN_VAMPIRICISM );
+        hunger += 20 * player_equip_ego_type( EQ_WEAPON, SPWPN_VAMPIRES_TOOTH );
     }
 
     // troll leather armour
     if (you.species != SP_TROLL)
-        hunger += player_equip( EQ_BODY_ARMOUR, ARM_TROLL_LEATHER_ARMOUR );
+        hunger += 10 * player_equip( EQ_BODY_ARMOUR, ARM_TROLL_LEATHER_ARMOUR );
 
     // randarts
-    hunger += scan_randarts(RAP_METABOLISM);
+    hunger += 10 * scan_randarts(RAP_METABOLISM);
 
     // burden
-    hunger += you.burden_state;
+    hunger += 10 * you.burden_state;
+
+    if (Options.hunger_rate_percent != 100)
+    {
+        hunger = hunger * Options.hunger_rate_percent / 100;  
+    }
 
     if (hunger < 1)
         hunger = 1;
@@ -5543,7 +5548,7 @@
     char_class       = JOB_UNKNOWN;
     species          = SP_UNKNOWN;
 
-    hunger       = 6000;
+    hunger       = 60000;
     hunger_state = HS_SATIATED;
 
     wield_change            = false;
@@ -6152,6 +6157,10 @@
 
         return (food_cost/2);
     }
+    
+    if (Options.spell_hunger_percent != 100)
+        food_cost = food_cost * Options.spell_hunger_percent / 100;
+    
     return (food_cost);
 }
 
diff -urN source.orig/spells3.cc source/spells3.cc
--- source.orig/spells3.cc	2008-08-01 02:00:56.000000000 +0300
+++ source/spells3.cc	2008-09-10 01:58:55.000000000 +0300
@@ -403,7 +403,7 @@
                     break;
             }
 
-            make_hungry(food, false);
+            make_hungry(food*10, false);
         }
     }
 
diff -urN source.orig/spl-book.cc source/spl-book.cc
--- source.orig/spl-book.cc	2008-08-01 02:00:58.000000000 +0300
+++ source/spl-book.cc	2008-09-10 01:58:55.000000000 +0300
@@ -1529,7 +1529,7 @@
         return (-1);
     }
 
-    make_hungry(food, true, true);
+    make_hungry(food*10, true, true);
     istaff.plus -= mana;
     you.wield_change = true;
     you.turn_is_over = true;
diff -urN source.orig/spl-cast.cc source/spl-cast.cc
--- source.orig/spl-cast.cc	2008-08-01 02:01:03.000000000 +0300
+++ source/spl-cast.cc	2008-09-10 01:58:55.000000000 +0300
@@ -703,7 +703,7 @@
         const int spellh = calc_hunger( spell_hunger(spell) );
         if (spellh > 0)
         {
-            make_hungry(spellh, true);
+            make_hungry(spellh * 10, true);
             learned_something_new(TUT_SPELL_HUNGER);
         }
     }
@@ -3919,11 +3919,11 @@
     const int hunger = spell_hunger(spell);
     if ( hunger == 0 )
         return "None";
-    else if ( hunger < 25 )
+    else if ( hunger < 250 )
         return "Minor";
-    else if ( hunger < 150 )
+    else if ( hunger < 1500 )
         return "Moderate";
-    else if ( hunger < 500 )
+    else if ( hunger < 5000 )
         return "Major";
     else
         return "Extreme";
diff -urN source.orig/tags.cc source/tags.cc
--- source.orig/tags.cc	2008-08-01 02:01:01.000000000 +0300
+++ source/tags.cc	2008-09-10 01:58:55.000000000 +0300
@@ -861,7 +861,7 @@
 
     marshallShort(th, you.hp);
 
-    marshallShort(th, you.hunger);
+    marshallLong(th, you.hunger);
 
     // how many you.equip?
     marshallByte(th, NUM_EQUIP);
@@ -1247,7 +1247,7 @@
     you.disease         = unmarshallByte(th);
     you.species         = static_cast<species_type>(unmarshallByte(th));
     you.hp              = unmarshallShort(th);
-    you.hunger          = unmarshallShort(th);
+    you.hunger          = unmarshallLong(th);
 
     // How many you.equip?
     count_c = unmarshallByte(th);

