cdirt/ascii/
cdirt/data/BULL/
cdirt/data/ZONES/PENDING/
cdirt/pending/
cdirt/src/utils/
cdirt/utils/
#include <stdlib.h>
#include "kernel.h"
#include "levels.h"
#include "sendsys.h"
#include "pflags.h"
#include "sflags.h"
#include "frob.h"
#include "uaf.h"
#include "mobile.h"
#include "log.h"
#include "parse.h"
#include "bprintf.h"
#include "mud.h"
#include "flags.h"
#include "wizlist.h"
#include "level.h"

#define PFLAGS_FROB ((1<<PFL_FROB)|(1<<PFL_CH_SCORE)|(1<<PFL_CH_LEVEL))
#define legal(lev) (lev >= LVL_MIN && lev <= LVL_MAX)
#define cant_frob(lev) (!legal(lev) || lev > plev(mynum))

struct _f {
  int state;
  int oldwork;
  int oldlev;
  int level;
  int strength;
  int score;
  char *oldprompt;
  char name[PNAME_LEN];
};


static void
log (char *n, int lev, int sco, int str)
{
  mudlog ("FROB: %s by %s: Lev = %d, Sco = %d, Str = %d",
	  n, pname (mynum), lev, sco, str);
}

void frobcom (char *line) {
  PERSONA p;
  struct _f *f;
  int x;

  if (line == NULL) {
    if (!tstbits (pflags (mynum).l, PFLAGS_FROB)) {
      erreval ();
      return;
    }
    if (brkword () == -1
	|| ((x = fmbn (wordbuf)) == -1 && !ptstflg (mynum, PFL_UAF))) {\
      bprintf ("Frob who?\n");
      return;
    }
    if (x == -1) {
      if (!getuaf (wordbuf, &p)) {
	bprintf ("No such persona in system.\n");
	return;
      }
      if (p.ublock.plev > plev(mynum)) {
	bprintf ("%s is too powerful!\n", wordbuf);
	return;
      }
    } 
    else if (plev(x) > plev(mynum)) {
      bprintf ("%s is too powerful!\n", wordbuf);
      return;
    } 
    else {
      p.ublock.plev = plev (x);
      p.ublock.pstr = pstr (x);
      p.ublock.pscore = pscore (x);
      strcpy (p.ublock.pname, pname (x));
    }
    f = NEW (struct _f, 1);

    strcpy (f->name, p.ublock.pname);
    f->state = 0;
    f->level = p.ublock.plev;
    f->oldlev = p.ublock.plev;
    f->strength = p.ublock.pstr;
    f->score = p.ublock.pscore;
    f->oldprompt = COPY (cur_player->cprompt);
    strcpy (cur_player->cprompt, "New Level: ");
    f->oldwork = cur_player->work;
    cur_player->work = (int) f;
    bprintf ("\001f" FROBCHT "\003");
    bprintf ("Level is: %d\n", f->oldlev);
    push_input_handler (frobcom);
  } 
  else {
    while (*line == ' ' || *line == '\t')
      ++line;
    f = (struct _f *) cur_player->work;

    switch (f->state) {
    case 0:
      if (*line == '\0')
	x = f->level;
      else 
	x = atoi (line);

      if (x < 1 || x > LVL_MAX) {
	bprintf ("Level must be between %d and %d\n", 1, LVL_MAX);
	f->state = 20;
      } 
      else if (cant_frob (x)) {
	bprintf ("You can't do that, sorry.\n");
	f->state = 20;
      } 
      else {
	f->level = x;
	f->state = 1;
	bprintf ("Score is: %d\n", f->score);
	strcpy (cur_player->cprompt, "New Score: ");
      }
      break;

    case 1:
      if (*line == '\0')
	x = f->score;
      else
	x = atoi (line);

      f->score = x;
      f->state = 2;
      bprintf ("Strength is: %d\n", f->strength);
      strcpy (cur_player->cprompt, "New Strength: ");
      break;

    case 2:
      if (*line == '\0')
	x = f->strength;
      else
	x = atoi (line);

      if (x <= 0) {
	bprintf ("Strength must be positive.\n");
	f->state = 20;
      }
      else {
	f->strength = x;
	if ((x = fpbn(f->name)) == -1) {
	  if (!ptstflg (mynum, PFL_UAF)) {
	    bprintf ("%s isn't here.\n", f->name);
	    f->state = 20;
	  } 
          else if (!getuaf (f->name, &p)) {
	    bprintf ("No player named %s.\n", f->name);
	    f->state = 20;
	  }
	} 
        else {
	  p.ublock.plev = plev (x);
	  p.ublock.pstr = pstr (x);
	  p.ublock.pscore = pscore (x);
	}
	if (f->state == 2) {
	  log (f->name, f->level, f->score, f->strength);

	  if (x >= 0) {
	    setpstr (x, f->strength);
       
            if (f->level < LVL_WIZARD) {
              if (f->level !=  plev(x))
                setpscore(x, levels[f->level]);
              else
                setpscore(x, f->score);
            }
            
            setplev(x, f->level);
            calib_player(x);

            if (f->oldlev < plev(x))
              give_skills(eflags(x), x, f->oldlev, plev(x));
            else
              take_skills(eflags(x), x, f->oldlev, plev(x));

            setptitle(x, std_title(plev(x), psex(x), pclass(x)));
	    set_xpflags (f->level, &pflags (x), &pmask (x));
            if (f->level > LVL_WIZARD)
              players[x].wiz_time = global_clock;
	  } 
          else {
	    p.ublock.plev = f->level;
	    p.ublock.pstr = f->strength;
	    p.ublock.pscore = f->score;
	    if (f->level > LVL_WIZARD)
              p.player.wiz_time = global_clock;

            if (f->oldlev < plev(x))
              give_skills(p.ublock.peflags, NOBODY, f->oldlev, f->level);
            else
              take_skills(p.ublock.peflags, NOBODY, f->oldlev, f->level);

	    set_xpflags (f->level, &p.ublock.pflags, &p.ublock.pmask);
	    strcpy (p.player.ptitle, std_title (f->level, 
              xtstbit (p.ublock.psflags.l, SFL_FEMALE), p.ublock.class));
	    putuaf (&p);
	  }
	  update_wizlist (f->name, wlevel (f->level));
	  bprintf ("Ok.\n");
	  f->state = 20;
	}
      }
      break;
    }
    if (f->state == 20) {
      strcpy (cur_player->cprompt, f->oldprompt);
      FREE (f->oldprompt);
      cur_player->work = f->oldwork;
      FREE (f);
      pop_input_handler ();
    }
  }
}