#include <stdlib.h>
#include "kernel.h"
#include "levels.h"
#include "uaf.h"
#include "mobile.h"
#include "sendsys.h"
#include "change.h"
#include "parse.h"
#include "zones.h"
#include "bprintf.h"
#include "log.h"
#include "wizlist.h"
#include "rooms.h"
#include "objsys.h"
#include "mud.h"
#include "fight.h"
static void change_visibility (void);
static void change_speed (void);
static void change_sex (void);
static void change_level (void);
static void change_score (void);
static void change_strength (void);
static void change_damage (void);
static void change_armor (void);
static void change_aggression (void);
static void change_passwd (void);
static void change_name (void);
static void change_wimpy (void);
static void change_magic (void);
static void change_coins (void);
static void change_start (void);
static char *ChTable[] =
{
"sex", "speed", "score", "strength", "level", "visibility", "damage",
"aggression", "title", "password", "name", "description", "armor",
"wimpy", "magic", "coins", "start", TABLE_END
};
void (*ChFunTable[]) (void) =
{
change_sex, change_speed, change_score, change_strength, change_level,
change_visibility, change_damage, change_aggression, change_title,
change_passwd, change_name, change_desc, change_armor, change_wimpy,
change_magic, change_coins, change_start
};
#define SEX 0
#define SPEED 1
#define SCORE 2
#define STRENGTH 3
#define LEVEL 4
#define VIS 5
#define DAMAGE 6
#define AGG 11
#define TITLE 12
#define PASSWD 13
#define NAME 14
#define DESC 15
#define ARMOR 16
#define WIMPY 17
#define MAGIC 18
#define COINS 19
#define START 20
void changecom (void) {
int x;
if (brkword () == -1) {
bprintf ("Change what?\n");
return;
}
if (aliased(real_mynum)) {
bprintf ("Not while aliased.\n");
return;
}
if ((x = tlookup (wordbuf, ChTable)) >= 0)
ChFunTable[x] ();
else
bprintf ("I don't know how to change that.\n");
}
static void change_sex (void) {
int a, w;
PERSONA p;
Boolean f, is_me;
if (!ptstflg (mynum, PFL_UAF) || plev (mynum) < LVL_WIZARD) {
if ((a = vicf2 (SPELL_VIOLENT, 7)) < 0)
return;
player2pers (&p, NULL, a);
f = False;
}
else if (brkword () == -1 || (a = find_player(wordbuf, &p, &f)) == -1) {
bprintf ("Who?\n");
return;
}
is_me = !f && a == mynum;
if ((w = wlevel (plev (mynum)) - wlevel (p.ublock.plev)) < 0
|| (w == 0 && plev (mynum) >= LVL_WIZARD && plev (mynum) < LVL_GOD && !is_me)) {
bprintf ("You can't do that to %s.\n", p.ublock.pname);
return;
}
if (f) {
pset_flg(p.ublock.bits, SFL_FEMALE, SFLAGS);
if (p.ublock.plev <= LVL_WIZARD && p.ublock.plev >= 1)
strcpy(p.player.ptitle, std_title (p.ublock.plev,
ptst_flg(p.ublock.bits, SFL_FEMALE, SFLAGS), p.ublock.class));
putuaf (&p);
}
else {
setpsex (a, !psex (a));
if (plev (a) <= LVL_WIZARD && plev (a) >= 1) {
setptitle (a, std_title (plev (a), psex (a), pclass(a)));
}
sendf (a, "Your sex has been magically changed!\nYou are now %s.\n",
psex (a) ? "female" : "male");
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_WIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange &*(Sex: "
"%s): &+W%s &*changed &+W%s&+B]\n",
psex (a) ? "Female" : "Male", pname (mynum), pname (a));
}
}
/* Change the speed of mobiles.
*/
static void
change_speed (void)
{
int a, new_speed, old_speed;
if (plev (mynum) < LVL_WIZARD) {
bprintf ("I don't know how to change that.\n");
return;
}
if (brkword () == -1) {
bprintf ("For whom ?\n");
return;
}
if ((a = fmbn (wordbuf)) < 0 || a < max_players) {
bprintf ("There is no mobile by that name.\n");
return;
}
if (brkword () == -1 || !isdigit (*wordbuf)) {
bprintf ("Set speed to what ?");
return;
}
if ((new_speed = atoi (wordbuf)) > 100) {
bprintf ("The highest value is 100.\n");
new_speed = 100;
}
old_speed = pspeed (a);
bprintf ("Setting speed for %s to %d.\n", pname (a), new_speed);
setpspeed (a, new_speed);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_WIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange &*(Speed: "
"%d->%d): &+W%s &*changed &+W%s&+B]\n",
old_speed, new_speed, pname (mynum), pname (a));
}
static void
change_score (void)
{
Boolean f, is_me, is_mobile;
int a;
int new_score, old_score;
PERSONA p;
if (brkword () == -1 || (a = find_player (wordbuf, &p, &f)) == -1) {
bprintf ("Who?\n");
return;
}
is_me = !f && a == mynum;
is_mobile = !f && a >= max_players;
if (plev (mynum) < LVL_WIZARD || !ptstflg (mynum, PFL_CH_SCORE)) {
erreval ();
return;
}
if (!is_mobile && !is_me && !ptstflg (mynum, PFL_FROB)) {
bprintf ("You can only change your own score.\n");
return;
}
if (wlevel (plev (mynum)) <= wlevel (p.ublock.plev) && !is_me) {
bprintf ("That is beyond your powers.\n");
return;
}
new_score = (brkword () < 0) ? p.ublock.pscore : atoi (wordbuf);
if (new_score < 0 || new_score > levels[LVL_WIZARD]) {
bprintf ("Score out of range!\n");
return;
}
if (!is_me && !is_mobile) {
mudlog ("CHANGE: %s changed score on %s from %d to %d",
pname (mynum), p.ublock.pname, p.ublock.pscore, new_score);
}
bprintf ("Setting score for %s to %d\n", p.ublock.pname, new_score);
if (f) {
old_score = p.ublock.pscore;
p.ublock.pscore = new_score;
putuaf (&p);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Score: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_score, new_score, pname (mynum), p.ublock.pname);
} else {
old_score = pscore (a);
setpscore (a, new_score);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Score: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_score, new_score, pname (mynum), pname (a));
}
}
static void change_coins (void) {
Boolean f, is_me, is_mobile;
int a;
int new_coins, old_coins;
PERSONA p;
if (brkword () == -1 || (a = find_player (wordbuf, &p, &f)) == -1) {
bprintf ("Who?\n");
return;
}
is_me = !f && a == mynum;
is_mobile = !f && a >= max_players;
if (plev (mynum) < LVL_WIZARD || !ptstflg (mynum, PFL_CH_COINS)) {
erreval ();
return;
}
if (!is_mobile && !is_me && !ptstflg (mynum, PFL_FROB)) {
bprintf ("You can only change your own coins.\n");
return;
}
if (wlevel (plev (mynum)) <= wlevel (p.ublock.plev) && !is_me) {
bprintf ("That is beyond your powers.\n");
return;
}
new_coins = (brkword() == -1) ? p.player.coins : atoi (wordbuf);
if (new_coins < 0) {
bprintf ("Must be a positive number!\n");
return;
}
if (!is_me && !is_mobile) {
mudlog ("CHANGE: %s changed coins on %s from %d to %d",
pname (mynum), p.ublock.pname, p.player.coins, new_coins);
}
bprintf ("Setting coins for %s to %d\n", p.ublock.pname, new_coins);
if (f) {
old_coins = p.player.coins;
p.player.coins = new_coins;
putuaf (&p);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Coins: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_coins, new_coins, pname(mynum), p.ublock.pname);
} else {
old_coins = pcoins(a);
pcoins(a) = new_coins;
send_msg(DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Coins: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_coins, new_coins, pname(mynum), pname(a));
}
}
static void
change_strength (void)
{
Boolean f, is_mobile, is_me;
int a, new_str, old_str, max_str;
PERSONA p;
if (brkword () == -1 || (a = find_player (wordbuf, &p, &f)) == -1) {
bprintf ("Who?\n");
return;
}
is_me = !f && a == mynum;
is_mobile = !f && a >= max_players;
max_str = is_mobile ? pstr_reset (a) : maxstrength (a);
if ((is_mobile && !ptstflg (mynum, PFL_CH_MDATA))
|| (!is_mobile && !ptstflg (mynum, PFL_HEAL))) {
erreval ();
return;
}
if (wlevel (plev (mynum)) <= wlevel (p.ublock.plev) && !is_me) {
bprintf ("That is beyond your powers.\n");
return;
}
new_str = (brkword () < 0) ? p.ublock.pstr : max (0, atoi (wordbuf));
if (new_str < 1 || new_str > max_str) {
bprintf ("Out of Range!\n");
return;
}
if (p.ublock.pstr > new_str && !is_mobile && !is_me) {
if (!ptstflg (mynum, PFL_FROB)) {
bprintf ("How rude of you! Trying to make other players weaker!\n");
return;
} else {
mudlog ("CHANGE: %s lowered %s's strength from %d to %d",
pname (mynum), p.ublock.pname, p.ublock.pstr, new_str);
}
}
bprintf ("Setting strength of %s to %d\n", p.ublock.pname, new_str);
if (f) {
old_str = p.ublock.pstr;
p.ublock.pstr = new_str;
putuaf (&p);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Strength: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_str, new_str, pname (mynum), p.ublock.pname);
} else {
old_str = pstr (a);
setpstr (a, new_str);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Strength: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_str, new_str, pname (mynum), pname (a));
}
}
static void change_level (void) {
Boolean f, is_mobile, is_me;
int a, new_lvl, old_lvl;
PERSONA p;
if (plev (mynum) < LVL_WIZARD || !ptstflg (mynum, PFL_CH_LEVEL)) {
bprintf ("I don't know how to change that.\n");
return;
}
if (brkword () == -1 || (a = find_player (wordbuf, &p, &f)) == -1) {
bprintf ("Who is that?\n");
return;
}
is_me = !f && a == mynum;
is_mobile = !f && a >= max_players;
if (is_mobile) {
bprintf ("Changing level on mobiles doesn't make sense now!\n");
return;
}
if (!is_me && (!ptstflg (mynum, PFL_FROB)
|| (wlevel (p.ublock.plev) >= wlevel (plev (mynum)) && plev (mynum) < LVL_GOD))) {
bprintf ("You can't change level on %s.\n", p.ublock.pname);
return;
}
if (brkword () < 0) {
bprintf ("What level?\n");
return;
}
if ((new_lvl = atoi (wordbuf)) >= LVL_MAX || new_lvl < LVL_MIN) {
bprintf ("Level must be between %d and %d.\n", LVL_MIN, LVL_MAX - 1);
return;
}
if (plev (mynum) >= LVL_GOD || wlevel (new_lvl) < wlevel (plev (mynum))
|| (is_me && wlevel (new_lvl) == wlevel (plev (mynum)))) {
if (wlevel (p.ublock.plev) != wlevel (new_lvl)) {
update_wizlist (p.ublock.pname, wlevel (new_lvl));
set_xpflags(f ? p.ublock.bits : mbits(a), new_lvl);
}
if (f) {
if (p.ublock.plev <= LVL_WIZARD || new_lvl <= LVL_WIZARD) {
strcpy (p.player.ptitle, std_title(new_lvl,
ptst_flg(p.ublock.bits, SFL_FEMALE, SFLAGS), p.ublock.class));
}
old_lvl = p.ublock.plev;
p.ublock.plev = new_lvl;
putuaf (&p);
mudlog("&+BLEVEL:&N %s changed stored player %s's level [%d->%d]",
pname(mynum), p.ublock.pname, old_lvl, new_lvl);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Level: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_lvl, new_lvl, pname (mynum), p.ublock.pname);
}
else {
if (p.ublock.plev <= LVL_WIZARD || new_lvl <= LVL_WIZARD) {
setptitle (a, std_title (new_lvl,
ptst_flg(p.ublock.bits, SFL_FEMALE, SFLAGS), p.ublock.class));
}
old_lvl = plev (a);
setplev (a, new_lvl);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Level: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_lvl, new_lvl, pname (mynum), pname (a));
mudlog("&+BLEVEL:&N %s changed %s from %d to %d",
pname(mynum), pname(a), old_lvl, new_lvl);
}
}
else
bprintf ("You can't change %s to level %d!\n", p.ublock.pname, new_lvl);
}
static void change_visibility (void)
{
int a, new_vis, max_vis, old_vis;
Boolean f, is_me;
PERSONA p;
if (plev (mynum) < LVL_WIZARD) {
bprintf ("I don't know how to change that.\n");
return;
}
if (brkword () == -1 || (a = find_player (wordbuf, &p, &f)) == -1) {
bprintf ("Who is that?\n");
return;
}
is_me = !f && a == mynum;
if (!is_me && wlevel (p.ublock.plev) >= wlevel (plev (mynum))
&& plev (mynum) < LVL_GOD) {
bprintf ("You can't change visibility on %s!\n", p.ublock.pname);
return;
}
new_vis = (brkword () == -1) ? 0 : atoi (wordbuf);
if (plev (mynum) < LVL_ISTARI)
max_vis = LVL_ISTARI;
else if (plev (mynum) < LVL_ARCHWIZARD)
max_vis = LVL_ARCHWIZARD;
else if (plev (mynum) < LVL_DEMI)
max_vis = LVL_DEMI;
else if (plev (mynum) < LVL_SHALAFI)
max_vis = LVL_SHALAFI;
else if (plev (mynum) < LVL_GOD)
max_vis = LVL_GOD;
else if (plev (mynum) < LVL_CREATOR)
max_vis = LVL_CREATOR;
else
max_vis = LVL_MAX - 1;
if (new_vis > max_vis) {
bprintf ("The maximum is %d.\n", max_vis);
new_vis = max_vis;
}
bprintf ("Setting visibility for %s to %d.\n", p.ublock.pname, new_vis);
if (f) {
old_vis = p.ublock.pvis;
p.ublock.pvis = new_vis;
putuaf (&p);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Vis: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_vis, new_vis, pname (mynum), p.ublock.pname);
} else {
old_vis = pvis (a);
setpvis (a, new_vis);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Vis: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_vis, new_vis, pname (mynum), pname (a));
}
}
static void
change_damage (void)
{
Boolean f, is_me, is_mobile;
int a, new_damage, old_damage;
PERSONA p;
if (plev (mynum) < LVL_WIZARD) {
bprintf ("I don't know how to change that.\n");
return;
}
if (brkword () == -1 || (a = find_player (wordbuf, &p, &f)) == -1) {
bprintf ("Who?\n");
return;
}
is_me = !f && a == mynum;
is_mobile = !f && a >= max_players;
if ((is_mobile && !ptstflg (mynum, PFL_CH_MDATA)) ||
(!is_mobile && !is_me && (plev (mynum) < LVL_ARCHWIZARD)) ||
(wlevel (plev (mynum)) < wlevel (p.ublock.plev))) {
bprintf ("That is beyond your powers.\n");
return;
}
if (brkword () == -1) {
bprintf ("Change damage on %s to what ?\n", p.ublock.pname);
return;
}
new_damage = max (0, atoi (wordbuf));
if (new_damage < 0 || new_damage > 100) {
bprintf ("Out of Range!\n");
return;
}
if (!is_me) {
mudlog ("CHANGE: %s changed damage on %s from %d to %d",
pname (mynum), p.ublock.pname, p.ublock.pdam, new_damage);
}
bprintf ("Setting damage on %s %s to %d\n",
p.ublock.pname, is_mobile ? "" : "permanently", new_damage);
if (f) {
old_damage = p.ublock.pdam;
p.ublock.pdam = new_damage;
putuaf (&p);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Damage: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_damage, new_damage, pname (mynum), p.ublock.pname);
} else {
old_damage = pdam (a);
setpdam (a, new_damage);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Damage: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_damage, new_damage, pname (mynum), pname (a));
}
}
static void
change_armor (void)
{
Boolean f, is_me, is_mobile;
int a, new_armor, old_armor;
PERSONA p;
if (plev (mynum) < LVL_WIZARD) {
bprintf ("I don't know how to change that.\n");
return;
}
if (brkword () == -1 || (a = find_player (wordbuf, &p, &f)) == -1) {
bprintf ("Who?\n");
return;
}
is_me = !f && a == mynum;
is_mobile = !f && a >= max_players;
if ((is_mobile && !ptstflg (mynum, PFL_CH_MDATA)) ||
(!is_mobile && !is_me && (plev (mynum) < LVL_ARCHWIZARD)) ||
(wlevel (plev (mynum)) < wlevel (p.ublock.plev))) {
bprintf ("That is beyond your powers.\n");
return;
}
if (brkword () == -1) {
bprintf ("Change armor on %s to what ?\n", p.ublock.pname);
return;
}
new_armor = max (0, atoi (wordbuf));
if (!is_me) {
mudlog ("CHANGE: %s changed armor on %s from %d to %d",
pname (mynum), p.ublock.pname, p.ublock.parmor, new_armor);
}
bprintf ("Setting armor on %s%sto %d\n",
p.ublock.pname, is_mobile ? " " : " permanently ", new_armor);
if (f) {
old_armor = p.ublock.parmor;
p.ublock.parmor = new_armor;
putuaf (&p);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Armor: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_armor, new_armor, pname (mynum), p.ublock.pname);
} else {
old_armor = parmor (a);
setparmor (a, new_armor);
calc_ac(a);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Armor: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_armor, new_armor, pname (mynum), pname (a));
}
}
static void change_aggression (void) {
int a, new_agg, old_agg;
if (plev (mynum) < LVL_WIZARD || !ptstflg (mynum, PFL_CH_MDATA)) {
bprintf ("I don't know how to change that.\n");
return;
}
if (brkword () == -1) {
bprintf ("For whom ?\n");
return;
}
if ((a = fmbn (wordbuf)) < 0 || a < max_players) {
bprintf ("There is no mobile by that name.\n");
return;
}
if (brkword () == -1 || !isdigit (*wordbuf)) {
bprintf ("Set aggression to what ?");
return;
}
if ((new_agg = atoi (wordbuf)) > 100) {
bprintf ("The highest value is 100.\n");
new_agg = 100;
}
bprintf("Setting aggression on %s to %d\n", pname(a), new_agg);
old_agg = pagg (a);
setpagg (a, new_agg);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_WIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Aggression: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_agg, new_agg, pname (mynum), pname (a));
mudlog ("CHANGE: %s set %s to %d", pname (mynum), pname (a), new_agg);
}
static Boolean check_title (char *title) {
int num_title = 0;
char *p;
for (p = title ; *p ; p++) {
if (*p == '%') {
if (*(p + 1) == 's')
num_title++;
else
return False;
}
}
if (num_title == 1 || (num_title == 0 && plev(mynum) > LVL_WIZARD))
return True;
else
return False;
}
void change_title (void)
{
PERSONA p;
int a;
char buff[300];
Boolean f, is_me, is_mobile, disp_title = False;
if (!ptstflg (mynum, PFL_TITLES)) {
erreval ();
return;
}
if (brkword () == -1 || (a = find_player (wordbuf, &p, &f)) == -1) {
bprintf ("Who?\n");
return;
}
is_me = !f && a == mynum;
is_mobile = !f && a >= max_players;
getreinput (buff);
if (EMPTY (buff)) {
disp_title = True;
} else if (is_mobile) {
int lev;
char *owner = powner (a);
if (ppermanent (a)) {
bprintf ("That's a permanent mobile.\n");
return;
}
lev = plev(a);
if (!EQ (pname (mynum), owner) && !do_okay_l (plev (mynum), lev, False)) {
bprintf ("You can't change title on %s's mobiles.\n", owner);
return;
}
if (strchr (buff, '^') != NULL) {
bprintf ("Illegal character(s): '^' in title.\n");
return;
}
} else if (!is_me && !do_okay_l (plev (mynum), p.ublock.plev,
wlevel (p.ublock.plev) < wlevel (plev (mynum)))) {
bprintf ("That is beyond your powers.\n");
return;
} else if (strlen (buff) + strlen (pname(mynum)) > TITLE_LEN) {
bprintf ("Maximum title-length is %d characters.\n", TITLE_LEN);
return;
} else if (!check_title (buff)) {
bprintf ("Invalid format. See HELP TITLE\n");
return;
}
if (!f) {
if (disp_title)
bprintf ("Title: %s\n", is_mobile ? pftxt (a) :
make_title (ptitle (a), "<name>"));
else if (is_mobile) {
if (pftxt (a) != NULL)
FREE (pftxt (a));
pftxt (a) = COPY (buff);
} else {
setptitle (a, buff);
}
} else {
if (disp_title)
bprintf ("Title: %s\n", make_title (p.player.ptitle, "<name>"));
else {
strcpy (p.player.ptitle, buff);
putuaf (&p);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_WIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Title): &+W%s &*changed &+W%s&+B]\n",
pname (mynum), p.ublock.pname);
}
}
if (!disp_title)
bprintf ("Title changed on %s.\n", is_mobile ? pname (a) : p.ublock.pname);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_WIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange &*(Title): "
"&+W%s &*changed &+W%s&+B]\n",
pname (mynum), is_mobile ? pname (a) : p.ublock.pname);
}
static void
change_name (void)
{
PERSONA p, q;
char old_name[MNAME_LEN + 1];
char buff[256];
char buff2[256];
char *r;
int num;
int max_len;
Boolean in_uaf;
Boolean is_mobile;
Boolean is_me;
if (plev (mynum) < LVL_WIZARD) {
erreval ();
return;
}
if (brkword () == -1) {
bprintf ("Change name on who ?\n");
return;
}
if ((num = find_player (wordbuf, &p, &in_uaf)) == -1) {
bprintf ("No such player or mobile: %s.\n", wordbuf);
return;
}
strcpy (old_name, p.ublock.pname);
is_mobile = num >= max_players;
is_me = num == mynum;
max_len = is_mobile ? MNAME_LEN : PNAME_LEN;
if (EMPTY (getreinput (wordbuf))) {
bprintf ("Change name on %s to what ?\n", old_name);
return;
}
if (strlen (wordbuf) > max_len) {
bprintf ("Name too long, Maximum: %d.\n", max_len);
return;
}
for (r = wordbuf; isalpha (*r) || (is_mobile && *r == ' '); r++) ;
if (*r != '\0') {
bprintf ("Name contains illegal character: %c\n", *r);
return;
}
if (isalpha (*wordbuf))
*wordbuf = toupper (*wordbuf);
if (is_mobile) {
Boolean denied;
char *owner = powner (num);
if (ppermanent (num)) {
bprintf ("That's a permanent mobile.\n");
return;
}
if ((denied = !EQ (pname (mynum), owner))) {
int x, lev;
lev = (x = fpbn (owner)) >= 0 ? plev (x) :
getuaf (owner, &p) ? p.ublock.plev : 0;
if (do_okay_l (plev (mynum), lev, False)) {
denied = False;
}
}
if (denied) {
bprintf ("You're not powerful enough to change %s's mobiles.\n", owner);
return;
}
setpname (num, wordbuf);
FREE (pname_reset (num));
pname_reset (num) = COPY (wordbuf);
} else {
char *new_name = wordbuf;
if (plev (mynum) < LVL_SHALAFI) {
bprintf ("You can only change name on mobiles.\n");
return;
}
if (getuaf (new_name, &q)) {
bprintf ("%s already exists.\n", new_name);
return;
}
if (deluaf (old_name))
return;
strcpy (p.ublock.pname, new_name);
newuaf (&p);
if (!in_uaf)
setpname (num, new_name);
if ((num = get_zone_by_name (old_name)) >= num_const_zon) {
FREE (zname (num));
zname (num) = COPY (new_name);
}
sprintf(buff, "%s/%s", WIZ_ZONE_DIR, old_name);
sprintf(buff2, "%s/%s", WIZ_ZONE_DIR, new_name);
rename(buff, buff2);
update_wizlist (old_name, LEV_MORTAL);
update_wizlist (new_name, wlevel (p.ublock.plev));
bprintf ("Ok.\n");
mudlog ("CHANGE: %s changed name on %s to %s",
pname (mynum), old_name, new_name);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Name: %s->%s): &+W\001p%s\003 &*changed it&+B]\n",
old_name, new_name, pname (mynum));
}
}
static void change_room_desc (int loc, char *room_name) {
char buff[256];
char *owner = lowner (loc);
Boolean denied;
if (lpermanent (loc)) {
bprintf ("That's a permanent location.\n");
return;
}
if ((denied = !EQ (pname (mynum), owner))) {
int x, lev;
PERSONA p;
lev = (x = fpbn (owner)) >= 0 ? plev (x) :
getuaf (owner, &p) ? p.ublock.plev : 0;
if (do_okay_l (plev (mynum), lev, False)) {
denied = False;
}
}
if (denied) {
bprintf ("You're not powerful enough to change %s's rooms.", owner);
return;
}
cur_player->work2[0] = (long int) &llong(loc);
strcpy((char *) &(cur_player->work2[1]), "Room description changed.\n");
sprintf(buff, "%s/DESC.%s", TEMP_DIR, pname(mynum));
start_editor("Please enter the room description:\n",
"&+W[&+BC-Desc %.3d&+W]&N ", NULL, buff, False, TYPE_CHDESC);
}
#define LOAD_INCR 256
void load_from_file(char *filename) {
char *p, *q;
FILE *f;
int len = LOAD_INCR * 2;
f = FOPEN(filename, "r");
p = q = NEW(char, len);
while(!feof(f)) {
fgets(q, LOAD_INCR - 1, f);
if (strchr(q, '^')) {
bprintf("Text block cannot contain the ^ character.\n");
FCLOSE(f);
}
else if (strchr(q, '"')) {
bprintf("Text block cannot contain the \" character.\n");
FCLOSE(f);
}
q = q + strlen(q);
if (len - (q - p) < LOAD_INCR) {
len += LOAD_INCR;
p = resize_array(p, sizeof(char), len, len + LOAD_INCR);
}
}
FCLOSE(f);
*(q + strlen(q) - 1) = 0; /* remove newline */
if (*(char **) (cur_player->work2[0])) /* set whatever desc */
FREE(*(char **) (cur_player->work2[0]));
*(char **) (cur_player->work2[0]) = p;
bprintf((char *) &cur_player->work2[1]);
}
static void change_mob_desc (int mob, char *mob_name) {
char *owner = powner (mob);
char buff[256];
Boolean denied;
if (ppermanent (mob)) {
bprintf ("That's a permanent mobile.\n");
return;
}
if ((denied = !EQ (pname (mynum), owner))) {
int x, lev;
PERSONA p;
lev = (x = fpbn (owner)) >= 0 ? plev (x) :
getuaf (owner, &p) ? p.ublock.plev : 0;
if (do_okay_l (plev (mynum), lev, False)) {
denied = False;
}
}
if (denied) {
bprintf ("You're not powerful enough to change %s's mobiles.", owner);
return;
}
cur_player->work2[0] = (long int) &pexam(mob);
strcpy((char *) &cur_player->work2[1], "Mobile description changed.\n");
sprintf(buff, "%s/DESC.%s", TEMP_DIR, pname(mynum));
start_editor("Please enter the mobile description:\n",
"&+W[&+BC-Desc %.3d&+W]&N ", NULL, buff, False, TYPE_CHDESC);
}
static void change_obj_desc (int obj, char *obj_name) {
char *owner = oowner (obj);
char buff[256];
Boolean denied;
if (opermanent (obj)) {
bprintf ("That's a permanent object.\n");
return;
}
if ((denied = !EQ (pname (mynum), owner))) {
int x, lev;
PERSONA p;
lev = (x = fpbn (owner)) >= 0 ? plev (x) :
getuaf (owner, &p) ? p.ublock.plev : 0;
if (do_okay_l (plev (mynum), lev, False)) {
denied = False;
}
}
if (denied) {
bprintf ("You're not powerful enough to change %s's objects.", owner);
return;
}
cur_player->work2[0] = (long int) &oexam_text(obj);
strcpy((char *) &cur_player->work2[1], "Object description changed.\n");
sprintf(buff, "%s/DESC.%s", TEMP_DIR, pname(mynum));
start_editor("Please enter the object description:\n",
"&+W[&+BC-Desc %.3d&+W]&N ", NULL, buff, False, TYPE_CHDESC);
}
static void change_player_desc (PERSONA * p) {
char buff[128];
if (!EQ (pname (mynum), p->ublock.pname) &&
!do_okay_l (plev (mynum), p->ublock.plev, False)) {
bprintf ("You're not powerful enough to change %s's description.\n",
p->ublock.pname);
return;
}
sprintf (buff, DESC_DIR "/%s", p->ublock.pname);
start_editor ("Please enter the new description:\n",
"&+W[&+BC-Desc %.3d&+W]&N ",
buff, buff, False, TYPE_DESC);
}
void change_start (void) {
#define START_LOC 0
#define START_MOB 1
#define START_OBJ 2
}
void change_desc (void) {
#define DESC_LOC 0
#define DESC_MOB 1
#define DESC_OBJ 2
#define DESC_PLR 3
char *desc_type[] = {"Location", "Mobile", "Object", "Player", TABLE_END};
PERSONA p;
int loc;
if (brkword () == -1) {
if (aliased(real_mynum)) {
bprintf ("Not while aliased.\n");
return;
}
player2pers (&p, NULL, mynum);
change_player_desc (&p);
}
else {
int type = tlookup (wordbuf, desc_type);
if (brkword () == -1 || type == -1) {
bprintf ("Change description on what?\n");
return;
}
if (type == DESC_LOC && (loc = find_loc_by_name (wordbuf)) != -1)
change_room_desc (loc, wordbuf);
else if (type == DESC_MOB && (loc = fmbn (wordbuf)) >= max_players)
change_mob_desc (loc, pname (loc));
else if (type == DESC_OBJ && (loc = fobn (wordbuf)) >= 0)
change_obj_desc (loc, oname (loc));
else if (type == DESC_PLR && getuaf (wordbuf, &p))
change_player_desc (&p);
else
bprintf ("Can't find %s: %s\n", desc_type[type], wordbuf);
}
}
void change_passwd (void) {
PERSONA *p;
if (EQ(pname(mynum), MASTERUSER))
bprintf("Remember, you also need to change the UNVEIL_PASS in the code.\n");
if (brkword () != -1 && !EQ (wordbuf, pname (mynum))) {
if (plev (mynum) < LVL_SHALAFI) {
bprintf ("You can only change your own password.\n");
return;
}
p = NEW (PERSONA, 1);
if (!getuaf (wordbuf, p)) {
bprintf ("I cannot find anyone called \"%s\". \n", wordbuf);
FREE (p);
return;
}
cur_player->work = (int) p;
bprintf("\n\001R\003");
sprintf(cur_player->cprompt, "New Password for %s: ", wordbuf);
replace_input_handler (ask_new_passwd);
}
else {
bprintf("\n\001R\003");
strcpy (cur_player->cprompt, "Old Password: ");
replace_input_handler (ask_old_passwd);
}
}
void ask_old_passwd (char *pass) {
PERSONA *p;
char b[PASSWD_LEN];
my_crypt (b, pass);
if (strcmp (b, cur_player->passwd) != 0) {
bprintf ("\nWrong password!\n\001E\003");
mudlog ("CHANGE: Wrong old password for %s", pname (mynum));
get_command (NULL);
} else {
bprintf ("\n");
strcpy (cur_player->cprompt, "New Password: ");
cur_player->work = (int) (p = NEW (PERSONA, 1));
strcpy (p->ublock.pname, pname (mynum));
replace_input_handler (ask_new_passwd);
}
}
void ask_new_passwd (char *pass) {
PERSONA *p = (PERSONA *) (cur_player->work);
strcpy (p->player.passwd, pass);
strcpy (cur_player->cprompt, "Confirm Password: ");
replace_input_handler (ask_confirm_passwd);
}
void ask_confirm_passwd (char *pass) {
PERSONA *p = (PERSONA *) (cur_player->work);
PERSONA q;
int plx;
bprintf ("\001E\003");
if (strcmp (p->player.passwd, pass) != 0)
bprintf ("\nNot same new password, password not changed.\n");
else if (!getuaf (p->ublock.pname, &q))
bprintf ("\nCouldn't find entry in UAF file.\n");
else {
if ((plx = fpbn (p->ublock.pname)) >= 0)
player2pers (&q, &q.player.last_on, plx);
my_crypt (q.player.passwd, p->player.passwd);
putuaf (&q);
if (plx >= 0 && plx < max_players)
strcpy (players[plx].passwd, q.player.passwd);
bprintf (" Password changed.\n");
mudlog ("CHANGE: %s changed password on %s.", pname (mynum), q.ublock.pname);
}
get_command (NULL);
}
static void change_wimpy (void) {
char *player;
int oldwimp, newwimp, plx;
if (brkword() == -1) {
bprintf("Set your wimpy to what value?\n");
return;
}
else if (plev(mynum) < LVL_WIZARD && !isdigit(*wordbuf)) {
bprintf("You can only set your own wimpy level");
return;
}
else if (isdigit(*wordbuf)) {
player = pname(mynum);
oldwimp = pwimpy(mynum);
newwimp = atoi(wordbuf);
setpwimpy(mynum, newwimp);
if (newwimp)
bprintf("You will now flee at %d hit points.\n", newwimp);
else
bprintf("Auto-flee Disabled!\n");
}
else if ((plx = fmbn(wordbuf)) != -1) {
if (brkword() == -1) {
bprintf("Set %s's auto-flee to what value?\n", pname(plx));
return;
}
player = pname(plx);
oldwimp = pwimpy(plx);
newwimp = atoi(wordbuf);
setpwimpy(mynum, newwimp);
bprintf("You have set %s's wimpy to %d hit points.\n", pname(plx), newwimp);
}
else {
bprintf("%s is not online.\n", wordbuf);
return;
}
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Wimpy: %d->%d): &+W%s &*changed &+W%s&+B]\n",
oldwimp, newwimp, pname(mynum), player);
}
static void change_magic (void) {
Boolean f, is_mobile, is_me;
int a, new_mag, old_mag;
PERSONA p;
if (brkword () == -1 || (a = find_player (wordbuf, &p, &f)) == -1) {
bprintf ("Who?\n");
return;
}
is_me = !f && a == mynum;
is_mobile = !f && a >= max_players;
if (!ptstflg (mynum, PFL_HEAL)) {
erreval ();
return;
}
if (is_mobile) {
bprintf ("Mobiles do not use mana!\n");
return;
}
if (wlevel (plev (mynum)) <= wlevel (p.ublock.plev) && !is_me) {
bprintf ("That is beyond your powers.\n");
return;
}
new_mag = (brkword () < 0) ? p.player.pmagic : max (0, atoi (wordbuf));
if (new_mag < 0 || new_mag > maxmagic (a)) {
bprintf ("Out of Range!\n");
return;
}
if (p.player.pmagic > new_mag && !is_mobile && !is_me) {
if (!ptstflg (mynum, PFL_FROB)) {
bprintf ("How rude of you! Trying to take away people's mana!\n");
return;
}
}
bprintf ("Setting mana of %s to %d\n", p.ublock.pname, new_mag);
if (f) {
old_mag = p.player.pmagic;
p.player.pmagic = new_mag;
putuaf (&p);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Magic: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_mag, new_mag, pname (mynum), p.ublock.pname);
} else {
old_mag = pmagic (a);
setpmagic (a, new_mag);
send_msg (DEST_ALL, MODE_SFLAG | MS (SFL_SEEEXT), max (pvis (mynum),
LVL_ARCHWIZARD), LVL_MAX, mynum, NOBODY, "&+B[&+WChange "
"&*(Magic: %d->%d): &+W%s &*changed &+W%s&+B]\n",
old_mag, new_mag, pname (mynum), pname (a));
}
}