Main
Resources
TheMentor recently (last night in fact) pointed out to me that while vanilla iDirt lets you set the level of a player to -1 (the level of mobiles), certain commands cannot handle that; stats <player> and score specifically. Note: there may be others that we haven't found yet -- those two will bring your mud to a screeching SIGSEGV halt.

Let's start with score first. The score command makes a call to make_rank in mobile.c, which is where the damage if being done. As you can see in the below snip of code (taken from vanilla iDirt but reformatted somewhat here), if the player is still mortal, it looks up their title in the FLevels or MLevels array. If their level is -1, that leads to trying to access an element outside of the array.

char * make_rank (int player) {
  static char rank[80];
    
  if (plev(player) <= LVL_WIZARD)
    sprintf(
      rank, 
      "%s the %s (Level %d)", 
      pname (player),
      psex(player) ? FLevels[plev(player)] : MLevels[plev(player)],
      plev(player)
	);
  else
    sprintf(
      rank, 
      "%s the %s (Level %d)", 
      pname(player),
      WizLevels[wlevel(plev(player))], 
      plev(player)
    );
  return rank;
}
Now for the change. -1 is the level reserved for mobiles, in general, so it seems fair to designate the unlucky player as a mobile now. This quick change will accomplish that. I suppose we could have added a new level title to the FLevels and MLevels array and add 1 to the player's level before retrieving the title, but that would involve changing a lot more code to accomodate that.
char * make_rank (int player) {
  static char rank[80];

  if (plev(player) < 0) {
    sprintf(rank, "%s the Mobile (Level %d)", pname(player), plev(player)); 
  } else {
    if (plev (player) <= LVL_WIZARD)
      sprintf(
        rank, 
        "%s the %s (Level %d)", 
        pname (player),
        psex(player) ? FLevels[plev (player)] : MLevels[plev (player)],
        plev(player)
      );
    else
      sprintf(rank, "%s the %s (Level %d)", 
        pname(player),
        WizLevels[wlevel(plev(player))], 
        plev(player)
      );
  }
  return rank;
}
OK, on to stats. The stats command, used without any arguments, works just fine for players with a level of -1. It doesn't do too well when used on a specific player, however. Here's a snippet of the stats code, right at the point it breaks at. This is in the function showplayer, in acct.c.
if (!is_mobile) {
  bprintf ("\n&+WTitle      &+C: &+w%s", make_title (title, ""));
  bprintf ("\n&+WScore      &+C: &+w%d", d.p_score);
  bprintf ("\n&+WLevel      &+C: &+w%d &+B(&*%s&+B)", d.p_level,
    d.p_level < LVL_WIZARD ? is_female ? FLevels[d.p_level]
    : MLevels[d.p_level] : WizLevels[wlevel (d.p_level)]);
}
The problem is the line that prints out the level and title information; if you're a wizard or higher, the wizard level titles are printed out; otherwise, based on gender, you get the mortal level title. This doesn't take into account level -1 again. This small change fixes that though.
bprintf ("\n&+WLevel      &+C: &+w%d &+B(&*%s&+B)", d.p_level,
  ( d.p_level < 0 ) ? "Mobile\0" :
  d.p_level < LVL_WIZARD ? is_female ? FLevels[d.p_level]
  : MLevels[d.p_level] : WizLevels[wlevel (d.p_level)]);
That fixes the two SIGSEGV problems with a level of -1 that I know about. If others come up, this page will be updated.