idirt-1.82d/
idirt-1.82d/bin/
idirt-1.82d/data/LOGS/
idirt-1.82d/data/POLICY/
idirt-1.82d/data/WIZ_ZONES/
idirt-1.82d/doc/
idirt-1.82d/doc/info/
idirt-1.82d/doc/manual/
idirt-1.82d/src/Ident/
idirt-1.82d/src/utils/
idirt-1.82d/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"

#define PFLAGS_FROB ((1<<PFL_FROB)|(1<<PFL_CH_SCORE)|(1<<PFL_CH_LEVEL))

#define cant_fr(x,l,w,a,d,g) ((x<a && l>=w) || (x<d && l>=a) || (x<g && l>=d))
#define cant_frob(lev) \
cant_fr(plev(mynum),lev,LVL_WIZARD,LVL_ARCHWIZARD,LVL_AVATAR,LVL_GOD)

#define cant_fro(lev) (lev < LVL_MIN || lev >= LVL_MAX || cant_frob(lev))

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) {		/* First (initial) time */
    if (!tstbits (pflags (mynum).l, PFLAGS_FROB)) {
      erreval ();
      return;
    }
    if (brkword () == -1
	|| ((x = fpbn (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 (cant_frob (p.p_level)) {
	bprintf ("You can't frob %s!\n", wordbuf);
	return;
      }
    } else if (x >= max_players) {
      bprintf ("You can't frob mobiles!\n");
      return;
    } else if (cant_frob (plev (x))) {
      bprintf ("You can't frob %s!\n", wordbuf);
      return;
    } else {
      p.p_level = plev (x);
      p.p_strength = pstr (x);
      p.p_score = pscore (x);
      strcpy (p.p_name, pname (x));
    }
    f = NEW (struct _f, 1);

    strcpy (f->name, p.p_name);
    f->state = 0;
    f->level = p.p_level;
    f->oldlev = p.p_level;
    f->strength = p.p_strength;
    f->score = p.p_score;
    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->level);
    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 < LVL_NOVICE || x > LVL_MAX) {
	bprintf ("Level must be between %d and %d\n", LVL_NOVICE, LVL_MAX);
	f->state = 20;
      } else if (cant_fro (x)) {
	bprintf ("You can't do that.\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.p_level = plev (x);
	  p.p_strength = pstr (x);
	  p.p_score = pscore (x);
	}
	if (f->state == 2) {
	  log (f->name, f->level, f->score, f->strength);
	  if (x >= 0) {
	    setpstr (x, f->strength);
	    setpscore (x, f->score);
	    setplev (x, f->level);

	    set_xpflags (f->level, &pflags (x), &pmask (x));
	    setptitle (x, std_title (f->level, psex (x)));

	  } else {
	    p.p_level = f->level;
	    p.p_strength = f->strength;
	    p.p_score = f->score;

	    set_xpflags (f->level, &p.p_pflags, &p.p_mask);
	    strcpy (p.p_title,
		    std_title (f->level, tst_bit (&p.p_sflags, SFL_FEMALE)));

	    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 ();
    }
  }
  bprintf ("%s", cur_player->cprompt);
}