#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); }