diff -C3 -r /usr/src/stone_soup-0.3.2-src/docs/crawl_options.txt /home/tmp/rlpowell/stone_soup-0.3.2-src/docs/crawl_options.txt
*** /usr/src/stone_soup-0.3.2-src/docs/crawl_options.txt	2007-11-10 00:11:15.000000000 -0800
--- /home/tmp/rlpowell/stone_soup-0.3.2-src/docs/crawl_options.txt	2007-11-25 12:58:28.000000000 -0800
***************
*** 92,97 ****
--- 92,99 ----
  
  7-  Inline Lua.
  
+ 8-  Cheating.
+ 
  --------------------------------------------------------------------------------
  
  There are three broad types of Crawl options: true/false values
***************
*** 1290,1296 ****
          Will add a note for each spell memorised.
  
  6-  Miscellaneous.
! ==============
  
  6-a     All OS.
  ---------------
--- 1292,1298 ----
          Will add a note for each spell memorised.
  
  6-  Miscellaneous.
! ==================
  
  6-a     All OS.
  ---------------
***************
*** 1495,1501 ****
  
  
  7-      Inline Lua
! ------------------
  
  Lua code can be used directly in your init.txt/.crawlrc. You can use
  Lua to selectively include parts of your init.txt (based on character
--- 1497,1503 ----
  
  
  7-      Inline Lua
! ==================
  
  Lua code can be used directly in your init.txt/.crawlrc. You can use
  Lua to selectively include parts of your init.txt (based on character
***************
*** 1525,1527 ****
--- 1527,1588 ----
  : else
  autopickup = $?+"/!%
  : end
+ 
+ 
+ 8-      Cheating
+ ================
+ 
+ Certain options are *very* contrary to the spirit of Crawl.  They
+ are available for those who want a very different (and less
+ authentically roguelike) play experience.  Setting any of them flags
+ any character you load with them in your .crawlrc as a cheater, and
+ nasty messages to that effect will be printed in all high score
+ lists and character dumps.
+ 
+ cheating_monster_freq_div = 1
+ 	If set to anything higher than 1, multiplies the frequency
+ 	of monster spawning by that amount.  It's called _div for
+ 	internal reasons.  The maximum effective value is 240, but
+ 	anything above 20 or so is likely to present an
+ 	insurmountable challenge.  Values between 1 and 20 or so
+ 	make the game easier by allowing the player to rack up far
+ 	more experience and collect more bodies for food.
+     
+ cheating_no_death = false
+ 	If set to true, the game's basic response to character death
+ 	is to restore 1 hit point, and clear some things that are
+ 	likely to instantly kill the character again (poison,
+ 	disease, starvation, and paralysis).  A much more
+ 	interesting gaming experience can be achieved by combining
+ 	this option with some of the "Cheating Death Options" below,
+ 	all of which require this option to be true to have any
+ 	effect whatsoever.
+ 
+ 8-a     Cheating Death Options
+ ------------------------------
+ 
+ cheating_death_back_to_start = false
+ 	On death, the character is returned to the beginning of the
+ 	dungeon if they are still descending.  If they've gotten the
+ 	Orb and they are in the main dungeon, the are returned to
+ 	the bottom-most level (this is *supposed* to be a penalty,
+ 	you see).  In all other cases (i.e. have the Orb but aren't
+ 	in a normal dungeon level) nothing happens.
+ 
+ cheating_death_heal = false
+ 	Fully heals the character on death.
+ 	
+ cheating_death_fill_belly = false
+ 	Fully fills the character's belly on death (i.e. character
+ 	becomes Engorged).
+ 
+ cheating_death_lose_levels = 0
+ 	The number of levels the character has drained from them as
+ 	a penalty for death.  Note that when ascending with the Orb
+ 	and with cheating_death_back_to_start turned on, this can
+ 	lead to losing the levels and then being shunted back to
+ 	level 27 of the main dungeon, which is A Bad Thing.
+ 	
+ cheating_death_lose_gold = false
+ cheating_death_lose_random_items = 0
+ cheating_death_lose_wielded_item = false
diff -C3 -r /usr/src/stone_soup-0.3.2-src/source/AppHdr.h /home/tmp/rlpowell/stone_soup-0.3.2-src/source/AppHdr.h
*** /usr/src/stone_soup-0.3.2-src/source/AppHdr.h	2007-11-16 17:56:59.000000000 -0800
--- /home/tmp/rlpowell/stone_soup-0.3.2-src/source/AppHdr.h	2007-11-25 01:08:53.000000000 -0800
***************
*** 346,352 ****
  // Option to allow scoring of wizard characters.  Note that even if 
  // you define this option, wizard characters are still tagged as such 
  // in the score file.
! // #define SCORE_WIZARD_CHARACTERS
  
  // ================================================= --------------------------
  //jmf: New defines for a bunch of optional features.
--- 346,355 ----
  // Option to allow scoring of wizard characters.  Note that even if 
  // you define this option, wizard characters are still tagged as such 
  // in the score file.
! //
! // Also use this to score cheater characters.
! //
! // #define SCORE_WIZARD_CHARACTERS
  
  // ================================================= --------------------------
  //jmf: New defines for a bunch of optional features.
diff -C3 -r /usr/src/stone_soup-0.3.2-src/source/chardump.cc /home/tmp/rlpowell/stone_soup-0.3.2-src/source/chardump.cc
*** /usr/src/stone_soup-0.3.2-src/source/chardump.cc	2007-11-10 00:11:06.000000000 -0800
--- /home/tmp/rlpowell/stone_soup-0.3.2-src/source/chardump.cc	2007-11-25 11:45:47.000000000 -0800
***************
*** 68,73 ****
--- 68,74 ----
  
  static void sdump_header(dump_params &);
  static void sdump_stats(dump_params &);
+ static void sdump_special(dump_params &);
  static void sdump_location(dump_params &);
  static void sdump_religion(dump_params &);
  static void sdump_burden(dump_params &);
***************
*** 120,125 ****
--- 121,127 ----
  static dump_section_handler dump_handlers[] = {
      { "header",         sdump_header        },
      { "stats",          sdump_stats         },
+     { "special",        sdump_special       },
      { "location",       sdump_location      },
      { "religion",       sdump_religion      },
      { "burden",         sdump_burden        },
***************
*** 345,350 ****
--- 347,353 ----
  
  static void sdump_misc(dump_params &par)
  {
+     sdump_special(par);
      sdump_location(par);
      sdump_religion(par);
      sdump_burden(par);
***************
*** 568,573 ****
--- 571,589 ----
      text += "\n";
  }
  
+ static void sdump_special(dump_params &par)
+ {
+     if( you.wizard )
+     {
+         par.text += "You were a *WIZARD*.\n";
+     }
+ 
+     if( you.cheater )
+     {
+         par.text += "You were a damned dirty *CHEATER*.\n";
+     }
+ }
+ 
   //---------------------------------------------------------------
   //
   // dump_location
diff -C3 -r /usr/src/stone_soup-0.3.2-src/source/externs.h /home/tmp/rlpowell/stone_soup-0.3.2-src/source/externs.h
*** /usr/src/stone_soup-0.3.2-src/source/externs.h	2007-11-10 00:11:09.000000000 -0800
--- /home/tmp/rlpowell/stone_soup-0.3.2-src/source/externs.h	2007-11-25 01:22:42.000000000 -0800
***************
*** 645,650 ****
--- 645,651 ----
    // This field is here even in non-WIZARD compiles, since the 
    // player might have been playing previously under wiz mode.
    bool          wizard;               // true if player has entered wiz mode.
+   bool          cheater;              // true if player is using cheating options
    time_t        birth_time;           // start time of game
  
    time_t        start_time;           // start time of session
***************
*** 824,829 ****
--- 825,831 ----
      unsigned long experience;
      int experience_level;
      bool wizard;
+     bool cheater;
      species_type species;
      std::string class_name;
      player_save_info operator=(const player& rhs);
***************
*** 1489,1494 ****
--- 1491,1507 ----
      int         wiz_mode;       // yes, no, never in wiz mode to start
  #endif
  
+     // CHEATING OPTIONS
+     unsigned	cheating_monster_freq_div;		// Make regular dungeon monster spawning this multiple more frequent
+     bool	cheating_no_death;			// "Death" gives back 1 HP
+     bool	cheating_death_back_to_start;		// "Death" teleports you back to the beginning of the dungeon
+     bool	cheating_death_heal;			// "Death" gives back all HP
+     bool	cheating_death_fill_belly;		// "Death" removes all hunger
+     unsigned	cheating_death_lose_levels;		// "Death" strips N experience levels
+     bool	cheating_death_lose_gold;		// "Death" strips all your gold
+     unsigned	cheating_death_lose_random_items;	// "Death" strips N random items
+     bool	cheating_death_lose_wielded_item;	// "Death" strips the weapon/item you are wielding (in addition to any random items)
+ 
      // internal use only:
      int         sc_entries;     // # of score entries
      int         sc_format;      // Format for score entries
diff -C3 -r /usr/src/stone_soup-0.3.2-src/source/hiscores.cc /home/tmp/rlpowell/stone_soup-0.3.2-src/source/hiscores.cc
*** /usr/src/stone_soup-0.3.2-src/source/hiscores.cc	2007-11-10 00:11:05.000000000 -0800
--- /home/tmp/rlpowell/stone_soup-0.3.2-src/source/hiscores.cc	2007-11-25 00:30:22.000000000 -0800
***************
*** 531,536 ****
--- 531,537 ----
      piety = se.piety;
      penance = se.penance;
      wiz_mode = se.wiz_mode;
+     cheater = se.cheater;
      birth_time = se.birth_time;
      death_time = se.death_time;
      real_time = se.real_time;
***************
*** 643,648 ****
--- 644,650 ----
      piety = fields->int_field("piety");
      penance = fields->int_field("pen");
      wiz_mode = fields->int_field("wiz");
+     cheater = fields->int_field("cheater");
      birth_time = parse_time(fields->str_field("start"));
      death_time = parse_time(fields->str_field("end"));
      real_time  = fields->long_field("dur");
***************
*** 695,700 ****
--- 697,705 ----
      if (wiz_mode)
          fields->add_field("wiz", "%d", wiz_mode);
      
+     if (cheater)
+         fields->add_field("cheater", "%d", cheater);
+     
      fields->add_field("start", "%s", make_date_string(birth_time).c_str());
      fields->add_field("dur", "%ld", real_time);
      fields->add_field("turn", "%ld", num_turns);
***************
*** 880,885 ****
--- 885,891 ----
      piety = -1;
      penance = -1;
      wiz_mode = 0;
+     cheater = 0;
      birth_time = 0;
      death_time = 0;
      real_time = -1;
***************
*** 997,1002 ****
--- 1003,1010 ----
  #else
      wiz_mode = 0;
  #endif
+ 
+     cheater = (you.cheater ? 1 : 0);
  }
  
  std::string scorefile_entry::hiscore_line(death_desc_verbosity verbosity) const
***************
*** 1177,1184 ****
          scname = scname.substr(0, 10);
  
      return make_stringf(
!              "%8ld %-10s %s-%02d%s", points, scname.c_str(),
!              char_desc.c_str(), lvl, (wiz_mode == 1) ? "W" : "" );
  }
  
  std::string
--- 1185,1193 ----
          scname = scname.substr(0, 10);
  
      return make_stringf(
!              "%8ld %-10s %s-%02d%s%s", points, scname.c_str(),
!              char_desc.c_str(), lvl, (wiz_mode == 1) ? "W" : "",
! 	     (cheater == 1) ? "C" : "");
  }
  
  std::string
***************
*** 1228,1233 ****
--- 1237,1243 ----
      }
  
      desc += wiz_mode? ") *WIZ*" : ")";
+     desc += cheater ? ") *CHEATER*" : ")";
      desc += hiscore_newline_string();
  
      if (verbose)
diff -C3 -r /usr/src/stone_soup-0.3.2-src/source/hiscores.h /home/tmp/rlpowell/stone_soup-0.3.2-src/source/hiscores.h
*** /usr/src/stone_soup-0.3.2-src/source/hiscores.h	2007-11-10 00:11:11.000000000 -0800
--- /home/tmp/rlpowell/stone_soup-0.3.2-src/source/hiscores.h	2007-11-24 23:41:26.000000000 -0800
***************
*** 115,120 ****
--- 115,121 ----
      int         piety;              // piety 
      int         penance;            // penance
      char        wiz_mode;           // character used wiz mode
+     char        cheater;            // character cheated
      time_t      birth_time;         // start time of character
      time_t      death_time;         // end time of character
      long        real_time;          // real playing time in seconds
diff -C3 -r /usr/src/stone_soup-0.3.2-src/source/initfile.cc /home/tmp/rlpowell/stone_soup-0.3.2-src/source/initfile.cc
*** /usr/src/stone_soup-0.3.2-src/source/initfile.cc	2007-11-10 00:11:11.000000000 -0800
--- /home/tmp/rlpowell/stone_soup-0.3.2-src/source/initfile.cc	2007-11-25 01:30:31.000000000 -0800
***************
*** 733,738 ****
--- 733,749 ----
  
      no_dark_brand    = true;
  
+     // CHEATING OPTIONS
+     cheating_monster_freq_div = 1;
+     cheating_no_death = false;
+     cheating_death_back_to_start = false;
+     cheating_death_heal = false;
+     cheating_death_fill_belly = false;
+     cheating_death_lose_levels = 0;
+     cheating_death_lose_gold = false;
+     cheating_death_lose_random_items = 0;
+     cheating_death_lose_wielded_item = false;
+ 
  #ifdef WIZARD
      wiz_mode      = WIZ_NO;
  #endif
***************
*** 2589,2594 ****
--- 2600,2649 ----
          else
              pickup_mode = read_bool_or_number(field, pickup_mode, "auto:");
      }
+     // CHEATING OPTIONS
+     else if (key == "cheating_monster_freq_div") {
+         cheating_monster_freq_div = atoi( field.c_str() );
+         if (cheating_monster_freq_div < 1)
+             cheating_monster_freq_div = 1;
+         if (cheating_monster_freq_div > 240)
+             cheating_monster_freq_div = 240;
+ 	if (cheating_monster_freq_div != 1)
+ 	    you.cheater = 1;
+     }
+     else if (key == "cheating_no_death") {
+ 	cheating_no_death = read_bool(field, cheating_no_death);
+ 	if (cheating_no_death)
+ 	    you.cheater = 1;
+     }
+     // you.cheater isn't set for these next few options because
+     // none of the cheating_death options have effect unless
+     // cheating_no_death is true, and cheating_no_death sets
+     // you.cheat.
+     else if (key == "cheating_death_back_to_start") {
+ 	cheating_death_back_to_start = read_bool(field, cheating_death_back_to_start);
+     }
+     else if (key == "cheating_death_heal") {
+ 	cheating_death_heal = read_bool(field, cheating_death_heal);
+     }
+     else if (key == "cheating_death_fill_belly") {
+ 	cheating_death_fill_belly = read_bool(field, cheating_death_fill_belly);
+     }
+     else if (key == "cheating_death_lose_gold") {
+ 	cheating_death_lose_gold = read_bool(field, cheating_death_lose_gold);
+     }
+     else if (key == "cheating_death_lose_wielded_item") {
+ 	cheating_death_lose_wielded_item = read_bool(field, cheating_death_lose_wielded_item);
+     }
+     else if (key == "cheating_death_lose_levels") {
+         cheating_death_lose_levels = atoi( field.c_str() );
+         if (cheating_death_lose_levels < 0)
+             cheating_death_lose_levels = 0;
+     }
+     else if (key == "cheating_death_lose_random_items") {
+         cheating_death_lose_random_items = atoi( field.c_str() );
+         if (cheating_death_lose_random_items < 0)
+             cheating_death_lose_random_items = 0;
+     }
      // Catch-all else, copies option into map
      else if (runscript)
      {
diff -C3 -r /usr/src/stone_soup-0.3.2-src/source/makefile.dep /home/tmp/rlpowell/stone_soup-0.3.2-src/source/makefile.dep
*** /usr/src/stone_soup-0.3.2-src/source/makefile.dep	2007-11-10 00:15:34.000000000 -0800
--- /home/tmp/rlpowell/stone_soup-0.3.2-src/source/makefile.dep	2007-11-25 12:20:12.000000000 -0800
***************
*** 309,319 ****
    describe.h files.h Kills.h hiscores.h message.h mon-pick.h travel.h \
    mutation.h place.h religion.h skills2.h spl-util.h
  ouch.o: ouch.cc AppHdr.h libunix.h libutil.h defines.h enum.h ouch.h \
!   externs.h FixAry.h FixVec.h debug.h mpr.h chardump.h delay.h files.h \
!   hiscores.h invent.h menu.h format.h itemname.h itemprop.h items.h \
!   macro.h message.h misc.h mon-util.h monstuff.h notes.h player.h \
    randart.h religion.h shopping.h skills2.h spells4.h state.h stuff.h \
!   tutorial.h view.h
  output.o: output.cc AppHdr.h libunix.h libutil.h defines.h enum.h \
    output.h format.h externs.h FixAry.h FixVec.h debug.h mpr.h abl-show.h \
    describe.h direct.h ray.h fight.h randart.h initfile.h itemname.h \
--- 309,319 ----
    describe.h files.h Kills.h hiscores.h message.h mon-pick.h travel.h \
    mutation.h place.h religion.h skills2.h spl-util.h
  ouch.o: ouch.cc AppHdr.h libunix.h libutil.h defines.h enum.h ouch.h \
!   externs.h FixAry.h FixVec.h debug.h mpr.h chardump.h delay.h food.h \
!   files.h hiscores.h invent.h menu.h format.h itemname.h itemprop.h \
!   items.h macro.h message.h misc.h mon-util.h monstuff.h notes.h player.h \
    randart.h religion.h shopping.h skills2.h spells4.h state.h stuff.h \
!   tutorial.h view.h branch.h
  output.o: output.cc AppHdr.h libunix.h libutil.h defines.h enum.h \
    output.h format.h externs.h FixAry.h FixVec.h debug.h mpr.h abl-show.h \
    describe.h direct.h ray.h fight.h randart.h initfile.h itemname.h \
diff -C3 -r /usr/src/stone_soup-0.3.2-src/source/monplace.cc /home/tmp/rlpowell/stone_soup-0.3.2-src/source/monplace.cc
*** /usr/src/stone_soup-0.3.2-src/source/monplace.cc	2007-11-10 00:11:06.000000000 -0800
--- /home/tmp/rlpowell/stone_soup-0.3.2-src/source/monplace.cc	2007-11-24 23:07:50.000000000 -0800
***************
*** 188,194 ****
      // place normal dungeon monsters,  but not in player LOS
      if (you.level_type == LEVEL_DUNGEON
          && !player_in_branch( BRANCH_ECUMENICAL_TEMPLE )
!         && one_chance_in((you.char_direction == GDT_DESCENDING) ? 240 : 8))
      {
          proximity_type prox = (one_chance_in(10) ? PROX_NEAR_STAIRS 
                                                   : PROX_AWAY_FROM_PLAYER);
--- 188,194 ----
      // place normal dungeon monsters,  but not in player LOS
      if (you.level_type == LEVEL_DUNGEON
          && !player_in_branch( BRANCH_ECUMENICAL_TEMPLE )
!         && one_chance_in((you.char_direction == GDT_DESCENDING) ? (240 / Options.cheating_monster_freq_div) : 8))
      {
          proximity_type prox = (one_chance_in(10) ? PROX_NEAR_STAIRS 
                                                   : PROX_AWAY_FROM_PLAYER);
diff -C3 -r /usr/src/stone_soup-0.3.2-src/source/ouch.cc /home/tmp/rlpowell/stone_soup-0.3.2-src/source/ouch.cc
*** /usr/src/stone_soup-0.3.2-src/source/ouch.cc	2007-11-10 00:11:07.000000000 -0800
--- /home/tmp/rlpowell/stone_soup-0.3.2-src/source/ouch.cc	2007-11-25 12:55:38.000000000 -0800
***************
*** 53,61 ****
--- 53,63 ----
  
  #include "externs.h"
  
+ #include "branch.h"
  #include "chardump.h"
  #include "delay.h"
  #include "files.h"
+ #include "food.h"
  #include "hiscores.h"
  #include "invent.h"
  #include "itemname.h"
***************
*** 810,820 ****
          } // else hp <= 0
      }
  
- #ifdef WIZARD
      if (death_type != KILLED_BY_QUITTING 
          && death_type != KILLED_BY_WINNING
          && death_type != KILLED_BY_LEAVING)
      {
          if (you.wizard)
          {
  #ifdef USE_OPTIONAL_WIZARD_DEATH
--- 812,955 ----
          } // else hp <= 0
      }
  
      if (death_type != KILLED_BY_QUITTING 
          && death_type != KILLED_BY_WINNING
          && death_type != KILLED_BY_LEAVING)
      {
+ 	// CHEATING options; death cheating, in particular.
+ 	if( you.cheater && Options.cheating_no_death )
+ 	{
+ 	    int old_level = you.your_level;
+ 
+ 	    mpr( "Your being a damned dirty cheater protects you from death!", MSGCH_DANGER );
+ 	    // Give enough HP to be alive
+ 	    if( you.hp <= 0 )
+ 	    {
+ 		set_hp(1, false);
+ 	    }
+ 	    // Give enough levels/XP to be alive
+ 	    if( you.experience < 0 )
+ 	    {
+ 		you.experience = 0;
+ 		you.experience_level = 1;
+ 	    }
+ 	    // This shouldn't actually happen, by the way
+ 	    if( you.experience_level < 1 )
+ 	    {
+ 		you.experience = 0;
+ 		you.experience_level = 1;
+ 	    }
+             mprf(MSGCH_DIAGNOSTICS, "hunger: %d", you.hunger);
+ 	    // Don't be completely starving
+ 	    if( you.hunger < 2000 )
+ 	    {
+ 		set_hunger( 2000, true );
+ 	    }
+ 
+ 	    // Clear things likely to kill the player instantly
+ 	    reduce_poison_player( 1000 );
+ 	    if( you.disease )
+ 	    {
+ 		you.disease=1;
+ 		dec_disease_player();
+ 	    }
+ 	    if ( you.duration[DUR_PARALYSIS] > 0 )
+ 	    {
+ 		you.duration[DUR_PARALYSIS]=0;
+ 		mpr( "You can move again.", MSGCH_DURATION);
+ 	    }
+ 
+ 	    if( Options.cheating_death_heal )
+ 	    {
+ 		mpr( "Your being a damned dirty cheater restores your hit points!", MSGCH_DANGER );
+ 		set_hp(you.hp_max, false);
+ 	    }
+ 
+ 	    if( Options.cheating_death_fill_belly )
+ 	    {
+ 		mpr( "Your being a damned dirty cheater fills your belly!", MSGCH_DANGER );
+ 		set_hunger( 12000, true );
+ 	    }
+ 
+ 	    if( Options.cheating_death_lose_gold )
+ 	    {
+ 		mpr( "As a penalty for cheating death, you lose all your gold!", MSGCH_DANGER );
+ 		you.gold = 0;
+ 		you.redraw_gold = 1;
+ 	    }
+ 
+ 	    if( Options.cheating_death_lose_wielded_item && you.equip[EQ_WEAPON] != -1 )
+ 	    {
+ 		mprf( MSGCH_DANGER, "As a penalty for cheating death, you lose your weapon, %s!", (you.inv[you.equip[EQ_WEAPON]]).name(DESC_NOCAP_A).c_str() );
+ 		dec_inv_item_quantity( you.equip[EQ_WEAPON], 1 );
+ 	    }
+ 
+ 	    for( unsigned i = 1; i <= Options.cheating_death_lose_levels; i++ )
+ 	    {
+ 		// Can't go below 1, because that would kill us
+ 		// again, which would bring us back here...
+ 		if( you.experience_level <= 1 )
+ 		{
+ 		    if( you.experience > 0 )
+ 		    {
+ 			mpr( "As a penalty for cheating death, you lose experience!", MSGCH_DANGER );
+ 		    }
+ 		    you.experience = 0;
+ 		    you.experience_level = 1;
+ 		}
+ 		if( you.experience_level >= 2 )
+ 		{
+ 		    mpr( "As a penalty for cheating death, you lose a level of experience!", MSGCH_DANGER );
+ 		    lose_level();
+ 		}
+ 	    }
+ 
+ 	    //cheating_death_lose_levels=2
+ 
+ 	    for( unsigned i = 1; i <= Options.cheating_death_lose_random_items; i++ )
+ 	    {
+ 		// Count the items, select a random number in that
+ 		// range, then find that item and destroy it
+ 		int num_items = inv_count();
+ 		int delete_item = random2(num_items);
+ 		int which_item = 0;
+ 
+ 		for (int j = 0; j < ENDOFPACK; ++j)
+ 		{
+ 		    if( is_valid_item(you.inv[j]) )
+ 			which_item++;
+ 		    if( which_item == delete_item )
+ 		    {
+ 			//mprf("You drop %s.", quant_name(you.inv[i], delay.parm2, DESC_NOCAP_A).c_str());
+ 			mprf( MSGCH_DANGER, "As a penalty for cheating death, you lose %s!", you.inv[j].name(DESC_NOCAP_A).c_str() );
+ 		    }
+ 		}
+ 	    }
+ 
+ 	    // Normal characters go back to the start
+ 	    if( Options.cheating_death_back_to_start && you.char_direction != GDT_ASCENDING )
+ 	    {
+ 		mpr( "As a penalty (sort of) for cheating death, you are returned to the start of the dungeon!", MSGCH_DANGER );
+ 		you.your_level = -1;
+ 		down_stairs( old_level, DNGN_STONE_STAIRS_DOWN_I );
+ 	    }
+ 	    // Characters on their way up go back to the end
+ 	    if( Options.cheating_death_back_to_start && you.char_direction == GDT_ASCENDING && player_in_branch( BRANCH_MAIN_DUNGEON ) )
+ 	    {
+ 		// -1 so we go down to the last level, -1 because
+ 		// the main dungeon counts from 0
+ 		you.your_level = (your_branch().depth - 2);
+ 		magic_mapping(1000, 100, true, true);
+ 		mpr( "As a penalty for cheating death, you are returned to end of the dungeon!", MSGCH_DANGER );
+ 		down_stairs( old_level, DNGN_STONE_STAIRS_DOWN_I );
+ 	    }
+ 
+ 	    more();
+ 
+ 	    return;
+ 	}
+ 
+ #ifdef WIZARD
          if (you.wizard)
          {
  #ifdef USE_OPTIONAL_WIZARD_DEATH
***************
*** 836,843 ****
              return;
  #endif  // USE_OPTIONAL_WIZARD_DEATH
          }
-     }
  #endif  // WIZARD
  
      //okay, so you're dead:
  
--- 971,978 ----
              return;
  #endif  // USE_OPTIONAL_WIZARD_DEATH
          }
  #endif  // WIZARD
+     }
  
      //okay, so you're dead:
  
***************
*** 863,869 ****
  
      // only add non-wizards to the score file.
      // never generate bones files of wizard characters -- bwr
!     if (!you.wizard)
      {
          hiscores_new_entry(se);
          logfile_new_entry(se);
--- 998,1004 ----
  
      // only add non-wizards to the score file.
      // never generate bones files of wizard characters -- bwr
!     if (!you.wizard && !you.cheater)
      {
          hiscores_new_entry(se);
          logfile_new_entry(se);
diff -C3 -r /usr/src/stone_soup-0.3.2-src/source/player.cc /home/tmp/rlpowell/stone_soup-0.3.2-src/source/player.cc
*** /usr/src/stone_soup-0.3.2-src/source/player.cc	2007-11-10 00:11:09.000000000 -0800
--- /home/tmp/rlpowell/stone_soup-0.3.2-src/source/player.cc	2007-11-24 23:44:19.000000000 -0800
***************
*** 4840,4845 ****
--- 4840,4847 ----
      wizard = false;
  #endif
  
+     cheater = 0;
+ 
      your_name[0] = 0;
  
      banished = false;
***************
*** 4990,4995 ****
--- 4992,4998 ----
      experience = rhs.experience;
      experience_level = rhs.experience_level;
      wizard = rhs.wizard;
+     cheater = rhs.cheater;
      species = rhs.species;
      class_name = rhs.class_name;
      return *this;
***************
*** 5013,5018 ****
--- 5016,5024 ----
          desc << " (WIZ)";
  #endif
  
+     if (cheater)
+ 	desc << " (CHEATER)";
+ 
      return desc.str();
  }
  
