#include "kernel.h" #include "stdinc.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_APPREN,LVL_ARCHWIZARD,LVL_DEMI, 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; int ingame; 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; int n; if (line == NULL) { /* First (initial) time */ if (!ptstflg(mynum, PFL_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->ingame = fpbn(f->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->prompt); bprintf("Level name Level Score Strength Level name Level Score Strength\n"); bprintf("---------- ----- ----- -------- ---------- ----- ----- --------\n"); bprintf("Novice 1 0 56 Wanderer 2 400 62 \n"); bprintf("Sightseer 3 1000 68 Nomad 4 2000 74 \n"); bprintf("Warrior 5 3500 80 Champion 6 6000 86 \n"); bprintf("Squire 7 9500 92 Knight 8 14000 98 \n"); bprintf("Prince 9 20000 104 Ruler 10 30000 110 \n"); bprintf("Conqueror 11 45000 116 Magician 12 65000 122 \n"); bprintf("Evoker 13 95000 128 Honorable 14 130000 134 \n"); bprintf("Holy 15 160000 140 Priest 16 200000 146 \n"); bprintf("Appren Wiz 17 250000 152 Emerit.Wiz 18 -- 158 \n"); bprintf("Wizard 1000 -- 6050 Senior Wiz 5000 -- 30050 \n"); bprintf("Archwiz 10000 -- 60050 High Arch 30000 -- 180050 \n"); bprintf("Demigod 50000 -- 300050 High Demi 80000 -- 480050 \n"); bprintf("---------- ----- ----- -------- ---------- ----- ----- --------\n"); strcpy (cur_player->prompt, "New Level: "); f->oldwork = cur_player->work; cur_player->work = (int) f; 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_ONE || x > LVL_MAX) { bprintf ("Level must be between %d and %d\n", LVL_ONE, 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->prompt, "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->prompt, "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); if (f->level >= 4) { set_doublebit (&pflags (x), PFL_TITLES); set_doublebit (&pflags (x), PFL_EMOTE); } if (wlevel (f->level) != wlevel (f->oldlev)) { set_xpflags (f->level, &pflags (x), &pmask (x)); } if (f->level <= LVL_APPREN || f->oldlev <= LVL_APPREN) { setptitle (x, std_title (f->level, psex (x))); } } else { p.p_level = f->level; p.p_strength = f->strength; p.p_score = f->score; if (wlevel (f->level) != wlevel (f->oldlev)) { set_xpflags (f->level, &p.p_pflags, &p.p_mask); } if (f->level <= LVL_APPREN || f->oldlev <= LVL_APPREN) { strcpy (p.p_title, std_title (f->level, xtstbit (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->prompt, f->oldprompt); free (f->oldprompt); cur_player->work = f->oldwork; if(f->ingame >=0 && is_in_game(f->ingame)) { n = mynum; setup_globals(f->ingame); saveme(); bprintf("%s", cur_player->prompt); setup_globals(n); } free (f); pop_input_handler (); } } bprintf ("%s", cur_player->prompt); } void wizfrobcom (void) { int x; if (!ptstflg(mynum, PFL_FROB)) { erreval(); return; } if (brkword() == -1 || ((x = fpbn(wordbuf)) == -1 )) { bprintf("Frob who?\n"); return; } 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 { setplev(x, 10); setpstr(x, 110); setpscore(x, 42000); psetflg(x, PFL_EMOTE); psetflg(x, PFL_TITLES); setptitle (x, std_title (10, ststflg(x,SFL_FEMALE))); mudlog("FROB: %s has given %s a wizfrob.",pname(mynum), pname(x)); bprintf("You have given %s a wizfrob.\n", pname(x)); } } void awizfrobcom (void) { int x; if (!ptstflg(mynum, PFL_FROB)) { erreval(); return; } if (brkword() == -1 || ((x = fpbn(wordbuf)) == -1 )) { return; } 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 { setplev(x, 11); setpstr(x, 116); setpscore(x, 62000); psetflg(x, PFL_EMOTE); psetflg(x, PFL_TITLES); setptitle (x, std_title (11, ststflg(x,SFL_FEMALE))); mudlog("FROB: %s has given %s an awizfrob.",pname(mynum), pname(x)); bprintf("You have given %s a awizfrob.\n", pname(x)); } } void dgodfrobcom (void) { int x; if (!ptstflg(mynum, PFL_FROB)) { erreval(); return; } if (brkword() == -1 || ((x = fpbn(wordbuf)) == -1 )) { return; } 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 { setplev(x, 12); setpstr(x, 122); setpscore(x, 82000); psetflg(x, PFL_EMOTE); psetflg(x, PFL_TITLES); setptitle (x, std_title (12, ststflg(x,SFL_FEMALE))); mudlog("FROB: %s has given %s a dgodfrob.",pname(mynum), pname(x)); bprintf("You have given %s a dgodfrob.\n", pname(x)); } } void godfrobcom (void) { int x; if (!ptstflg(mynum, PFL_FROB)) { erreval(); return; } if (brkword() == -1 || ((x = fpbn(wordbuf)) == -1 )) { return; } 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 { setplev(x, 13); setpstr(x, 128); setpscore(x, 102000); psetflg(x, PFL_EMOTE); psetflg(x, PFL_TITLES); setptitle (x, std_title (13, ststflg(x,SFL_FEMALE))); mudlog("FROB: %s has given %s a godfrob.",pname(mynum), pname(x)); bprintf("You have given %s a godfrob.\n", pname(x)); } }