diff -ur src/act_comm.c new/act_comm.c
--- src/act_comm.c Sat Mar 15 18:39:12 2003
+++ new/act_comm.c Thu Mar 20 15:08:45 2003
@@ -55,6 +55,9 @@
CH_CMD(do_delete)
{
char strsave[MAX_INPUT_LENGTH];
+ int hash;
+ ROOM_INDEX_DATA *pRoom;
+ void update_webpasses(CHAR_DATA * ch, bool pDelete);
if (IS_NPC(ch))
return;
@@ -71,6 +74,23 @@
{
delete_home(ch);
update_statlist(ch, TRUE);
+ update_webpasses(ch, TRUE);
+ if (is_clan(ch))
+ {
+ update_members(ch, TRUE);
+ }
+ for (hash = 0; hash < MAX_KEY_HASH; hash++)
+ {
+ for (pRoom = room_index_hash[hash]; pRoom != NULL;
+ pRoom = pRoom->next)
+ {
+ if (!IS_NULLSTR(pRoom->owner)
+ && !str_cmp(pRoom->owner, ch->name))
+ {
+ replace_string(pRoom->owner, "");
+ }
+ }
+ }
sprintf(strsave, "%s%s", PLAYER_DIR, capitalize(ch->name));
wiznet("$N turns $Mself into line noise.", ch, NULL, 0, 0, 0);
stop_fighting(ch, TRUE);
@@ -93,6 +113,66 @@
wiznet("$N is contemplating deletion.", ch, NULL, 0, 0, get_trust(ch));
}
+void update_last_data(CHAR_DATA * sender, CHAR_DATA * viewer, int last,
+ const char *chan, const char *str, int type)
+{
+ int i;
+ char time[MIL];
+ char buf[MSL];
+
+ if (IS_NPC(viewer) || IS_NULLSTR(str) || IS_NULLSTR(chan) || last < 0
+ || last >= LAST_MAX)
+ return;
+
+ for (i = LAST_PAGE_LENGTH - 1; i > 0; i--)
+ {
+ replace_string(viewer->pcdata->history[last][i],
+ viewer->pcdata->history[last][i - 1]);
+ }
+
+ strftime(time, 100, "%r", localtime(¤t_time));
+ switch (type)
+ {
+ case CHANNEL_NORMAL:
+ sprintf(buf, "[%s] %s{x %s says '%s'{x", time, chan, PERS(sender,
+ viewer), str);
+ replace_string(viewer->pcdata->history[last][0], buf);
+ break;
+ case CHANNEL_SOCIAL:
+ sprintf(buf, "[%s] %s{x %s{x", time, chan, str);
+ replace_string(viewer->pcdata->history[last][0], buf);
+ break;
+ case CHANNEL_EMOTE:
+ sprintf(buf, "[%s] %s{x %s %s{x",
+ time, chan, PERS(sender, viewer), str);
+ replace_string(viewer->pcdata->history[last][0], buf);
+ break;
+ default:
+ bugf("bad channel type [%d]", type);
+ break;
+ }
+}
+
+void view_last_data(CHAR_DATA * ch, int last)
+{
+ int i;
+ bool found = FALSE;
+
+ if (last < 0 || last >= LAST_MAX)
+ return;
+
+ for (i = LAST_PAGE_LENGTH - 1; i >= 0; i--)
+ {
+ if (!IS_NULLSTR(ch->pcdata->history[last][i]))
+ {
+ found = TRUE;
+ chprintln(ch, ch->pcdata->history[last][i]);
+ }
+ }
+ if (!found)
+ chprintln(ch, "None.");
+}
+
bool display_channel(CHAR_DATA * ch, CHAR_DATA * victim,
enum special_flags spec_flag)
{
@@ -127,7 +207,7 @@
void channel_social(CHAR_DATA * ch, CHAR_DATA * victim,
flag_t bit, const char *string, const char *type,
- enum special_flags spec_flag)
+ enum special_flags spec_flag, int last_type)
{
DESCRIPTOR_DATA *d;
@@ -146,13 +226,20 @@
char buf[MSL];
sprintf(buf, "%s %s", type, string);
- perform_act(buf, ch, NULL, victim, FALSE, vch);
+ perform_act(buf, ch, NULL, victim, 0, vch);
+ update_last_data(ch, vch, last_type, type,
+ perform_act_string(string, ch, NULL, victim,
+ FALSE), CHANNEL_SOCIAL);
}
}
+ update_last_data(ch, ch, last_type, type,
+ perform_act_string(string, ch, NULL, victim, FALSE),
+ CHANNEL_SOCIAL);
}
void public_ch(CHAR_DATA * ch, const char *argument,
- const char *type, flag_t bitname, enum special_flags spec_flag)
+ const char *type, flag_t bitname, enum special_flags spec_flag,
+ int last_type)
{
char command[MIL + 100];
DESCRIPTOR_DATA *d;
@@ -239,7 +326,7 @@
act_new(buf, ch, NULL, NULL, TO_CHAR, POS_DEAD);
channel_social(ch, NULL, bitname,
social_table[cmd].others_no_arg, type,
- spec_flag);
+ spec_flag, last_type);
}
else if ((victim = get_char_world(ch, argx)) == NULL)
{
@@ -259,7 +346,7 @@
act_new(buf, ch, NULL, NULL, TO_CHAR, POS_DEAD);
channel_social(ch, victim, bitname,
social_table[cmd].others_auto, type,
- spec_flag);
+ spec_flag, last_type);
}
else
{
@@ -275,7 +362,7 @@
}
channel_social(ch, victim, bitname,
social_table[cmd].others_found, type,
- spec_flag);
+ spec_flag, last_type);
}
}
return;
@@ -286,6 +373,7 @@
chprintlnf(ch, "%s %s %s{x", type,
IS_NPC(ch) ? ch->short_descr : ch->name, argument);
+ update_last_data(ch, ch, last_type, type, argument, CHANNEL_EMOTE);
}
else if (!str_cmp(command, "wholist"))
{
@@ -293,9 +381,19 @@
chprintlnf(ch, "{WPlayers on %s{x", type);
chprintln(ch, "{C-------------------{x");
}
+ else if (!str_cmp(command, "-h") && !IS_NPC(ch) && last_type >= 0
+ && last_type < LAST_MAX)
+ {
+ chprintlnf(ch, "{WLast %d messages on %s{x", LAST_PAGE_LENGTH,
+ type);
+ chprintln(ch, "{C------------------------------{x");
+ view_last_data(ch, last_type);
+ return;
+ }
else
{
chprintlnf(ch, "%s You say '%s'{x", type, arg_left);
+ update_last_data(ch, ch, last_type, type, arg_left, CHANNEL_NORMAL);
}
for (d = descriptor_first; d != NULL; d = d->next)
{
@@ -317,11 +415,15 @@
{
chprintlnf(victim, "%s %s %s{x", type,
smash_colour(PERS(ch, victim)), argument);
+ update_last_data(ch, victim, last_type, type, argument,
+ CHANNEL_EMOTE);
}
else
{
chprintlnf(victim, "%s %s says '%s'{x", type,
smash_colour(PERS(ch, victim)), arg_left);
+ update_last_data(ch, victim, last_type, type, arg_left,
+ CHANNEL_NORMAL);
}
}
else
@@ -541,38 +643,39 @@
CH_CMD(do_gossip)
{
public_ch(ch, argument, CTAG(_GOSSIP1) "[Gossip]" CTAG(_GOSSIP2),
- COMM_NOGOSSIP, spec_public_flag);
+ COMM_NOGOSSIP, spec_public_flag, LAST_GOSSIP);
}
CH_CMD(do_ooc)
{
- public_ch(ch, argument, "{C({WOOC{C){w", COMM_NOOOC, spec_public_flag);
+ public_ch(ch, argument, "{C({WOOC{C){w", COMM_NOOOC, spec_public_flag,
+ LAST_OOC);
}
CH_CMD(do_grats)
{
public_ch(ch, argument, CTAG(_GRATS1) "[Grats]" CTAG(_GRATS2), COMM_NOGRATS,
- spec_public_flag);
+ spec_public_flag, LAST_GRATS);
}
CH_CMD(do_quote)
{
public_ch(ch, argument, CTAG(_QUOTE1) "[Quote]" CTAG(_QUOTE2), COMM_NOQUOTE,
- spec_public_flag);
+ spec_public_flag, LAST_QUOTE);
}
/* RT question channel */
CH_CMD(do_question)
{
public_ch(ch, argument, CTAG(_QA1) "[Question]" CTAG(_QA2), COMM_NOQUESTION,
- spec_public_flag);
+ spec_public_flag, LAST_QA);
}
/* RT answer channel - uses same line as questions */
CH_CMD(do_answer)
{
public_ch(ch, argument, CTAG(_QA1) "[Answer]" CTAG(_QA2), COMM_NOQUESTION,
- spec_public_flag);
+ spec_public_flag, LAST_QA);
}
/* RT music channel */
@@ -580,7 +683,7 @@
{
public_ch(ch, argument,
CTAG(_MUSIC1) "[" CTAG(_MUSIC2) "MUSIC" CTAG(_MUSIC1) "]"
- CTAG(_MUSIC3), COMM_NOMUSIC, spec_public_flag);
+ CTAG(_MUSIC3), COMM_NOMUSIC, spec_public_flag, LAST_MUSIC);
}
/* clan channels */
@@ -592,14 +695,15 @@
return;
}
- public_ch(ch, argument, "{r[{RClan{r]{Y", COMM_NOCLAN, spec_clan_flag);
+ public_ch(ch, argument, "{r[{RClan{r]{Y", COMM_NOCLAN, spec_clan_flag,
+ LAST_CLANTALK);
}
CH_CMD(do_immtalk)
{
public_ch(ch, argument,
CTAG(_IMMTALK1) "[" CTAG(_IMMTALK2) "ImmTalk" CTAG(_IMMTALK1) "]"
- CTAG(_IMMTALK3), COMM_NOWIZ, spec_imm_flag);
+ CTAG(_IMMTALK3), COMM_NOWIZ, spec_imm_flag, LAST_IMMTALK);
}
CH_CMD(do_say)
@@ -1107,6 +1211,8 @@
save_char_obj(ch);
update_statlist(ch, FALSE);
+ if (is_clan(ch))
+ update_members(ch, FALSE);
chprintln(ch, "Saving. Remember that ROM has automatic saving now.");
WAIT_STATE(ch, PULSE_VIOLENCE);
return;
diff -ur src/act_wiz.c new/act_wiz.c
--- src/act_wiz.c Sat Mar 15 18:39:12 2003
+++ new/act_wiz.c Thu Mar 20 15:08:45 2003
@@ -205,6 +205,7 @@
chprintln(victim, "You are now a member of no clan!");
victim->clan = -1;
victim->rank = 0;
+ update_members(victim, TRUE);
return;
}
@@ -227,8 +228,14 @@
capitalize(clan_table[clan].name));
}
+ if (is_clan(victim))
+ {
+ update_members(victim, TRUE);
+ }
+
victim->clan = clan;
victim->rank = 0;
+ update_members(victim, FALSE);
}
/* equips a character */
@@ -1478,8 +1485,9 @@
chprintlnf(ch,
"Vnum: %ld Format: %s Race: %s Group: %d Sex: %s Room: %ld",
IS_NPC(victim) ? victim->pIndexData->vnum : 0,
- IS_NPC(victim) ? victim->pIndexData->
- new_format ? "new" : "old" : "pc", race_table[victim->race].name,
+ IS_NPC(victim) ? victim->
+ pIndexData->new_format ? "new" : "old" : "pc",
+ race_table[victim->race].name,
IS_NPC(victim) ? victim->group : 0, sex_table[victim->sex].name,
victim->in_room == NULL ? 0 : victim->in_room->vnum);
@@ -4086,8 +4094,8 @@
count++;
sprintf(buf + strlen(buf), "[%3d %2d] %s@%s\n\r",
d->descriptor, d->connected,
- d->original ? d->original->name : d->character ? d->
- character->name : "(none)", d->host);
+ d->original ? d->original->name : d->
+ character ? d->character->name : "(none)", d->host);
}
}
if (count == 0)
diff -ur src/buddy.c new/buddy.c
--- src/buddy.c Sat Mar 15 18:39:12 2003
+++ new/buddy.c Thu Mar 20 15:08:45 2003
@@ -39,7 +39,7 @@
public_ch(ch, argument,
"{W{{" CTAG(_BTALK1) "Buddy{W}" CTAG(_BTALK2), COMM_NOBUDDY,
- spec_buddy_flag);
+ spec_buddy_flag, LAST_BTALK);
return;
}
diff -ur src/clans.c new/clans.c
--- src/clans.c Sat Mar 15 18:39:12 2003
+++ new/clans.c Thu Mar 20 15:08:45 2003
@@ -37,6 +37,7 @@
#include "interp.h"
#include "lookup.h"
#include "tables.h"
+#include "recycle.h"
bool is_leader(CHAR_DATA * ch)
{
@@ -105,6 +106,7 @@
chprintlnf(victim, "You have been demoted to %s, by %s.",
clan_table[victim->clan].rank[rank].rankname, ch->name);
victim->rank = rank;
+ update_members(victim, FALSE);
}
else
{
@@ -115,18 +117,37 @@
clan_table[victim->clan].rank[rank].rankname,
capitalize(clan_table[victim->clan].name));
victim->rank = rank;
+ update_members(victim, FALSE);
}
}
CH_CMD(do_clist)
{
int i;
+ MBR_DATA *pmbr;
+ char buf[MSL];
+ char buf2[MSL];
chprintln(ch, "Clans available:");
chprintln(ch, draw_line(NULL, 0));
for (i = 0; i < maxClan; i++)
{
- chprintln(ch, clan_table[i].who_name);
+ chprint(ch, clan_table[i].who_name);
+ buf[0] = '\0';
+ buf2[0] = '\0';
+ for (pmbr = mbr_first; pmbr != NULL; pmbr = pmbr->next)
+ {
+ if (pmbr->clan != i || pmbr->rank != (MAX_RANK - 1))
+ continue;
+ sprintf(buf2, " %s,", pmbr->name);
+ strcat(buf, buf2);
+ }
+ if (!IS_NULLSTR(buf))
+ {
+ buf[strlen(buf) - 1] = '\0';
+ chprintf(ch, " (Leaders:%s)", buf);
+ }
+ chprintln(ch, "{x");
}
chprintln(ch, draw_line(NULL, 0));
chprintln(ch, "For more info use 'cinfo <clan>'.");
@@ -270,6 +291,8 @@
" : clanadmin invite <char> - invite a character to your clan.");
chprintln(ch,
" : clanadmin outcast <char> - kick a person out of your clan.");
+ chprintln(ch,
+ " : clanadmin members - list members in clan.");
if (IS_IMMORTAL(ch))
chprintln
(ch,
@@ -323,6 +346,26 @@
do_function(ch, &do_promote, argument);
return;
}
+ else if (!str_prefix(arg1, "members"))
+ {
+ MBR_DATA *mbr;
+ bool found = FALSE;
+
+ chprintln(ch, "Lev Name Rank");
+ chprintln(ch, "--- ------------ ------------");
+ for (mbr = mbr_first; mbr != NULL; mbr = mbr->next)
+ {
+ if (mbr->clan != clan)
+ continue;
+
+ chprintlnf(ch, "%3d %12s %12s", mbr->level, mbr->name,
+ clan_table[mbr->clan].rank[mbr->rank].rankname);
+ found = TRUE;
+ }
+ if (!found)
+ chprintln(ch, "No one in the clan.");
+ return;
+ }
else if (!str_prefix(arg1, "invite"))
{
if ((victim = get_char_world(ch, argument)) == NULL)
@@ -389,6 +432,7 @@
}
chprintln(ch, "They are now clanless.");
chprintln(victim, "Your clan leader has kicked you out!");
+ update_members(victim, TRUE);
victim->clan = -1;
victim->rank = 0;
char_from_room(victim);
@@ -438,6 +482,7 @@
clan_table[ch->clan].rank[ch->rank].rankname,
clan_table[ch->clan].who_name);
ch->invited = -1;
+ update_members(ch, FALSE);
return;
}
else if (!str_cmp(arg1, "deny"))
@@ -458,4 +503,129 @@
chprintln(ch, "Syntax: join <accept|deny>");
return;
}
+}
+
+void update_members(CHAR_DATA * ch, bool pdelete)
+{
+ MBR_DATA *curr, *next;
+
+ if (IS_NPC(ch))
+ return;
+
+ for (curr = mbr_first; curr != NULL; curr = next)
+ {
+ next = curr->next;
+
+ if (!str_cmp(ch->name, curr->name))
+ {
+ UNLINK(curr, mbr_first, mbr_last, next, prev);
+
+ free_mbr(curr);
+ save_members();
+ }
+ }
+ if (pdelete || !is_clan(ch) || clan_table[ch->clan].independent)
+ return;
+
+ curr = new_mbr();
+ replace_string(curr->name, ch->name);
+ curr->rank = ch->rank;
+ curr->clan = ch->clan;
+ curr->level = ch->level;
+ LINK(curr, mbr_first, mbr_last, next, prev);
+ save_members();
+ return;
+}
+
+CH_CMD(do_roster)
+{
+ int i, clan, count = 0;
+ MBR_DATA *pmbr;
+ char buf[MSL], buf2[MSL];
+ char arg[MIL];
+ char *rcol[MAX_RANK] = { "{R", "{B", "{Y", "{M", "{G", "{C" };
+
+ argument = one_argument(argument, arg);
+
+ if (IS_NULLSTR(arg))
+ {
+ chprintln(ch, "Syntax: roster <clan name>");
+ if (IS_IMMORTAL(ch))
+ chprintln(ch, " roster delete <name>");
+ return;
+ }
+
+ if (!str_cmp(arg, "delete") && IS_IMMORTAL(ch))
+ {
+ MBR_DATA *next = NULL;
+ MBR_DATA *curr = NULL;
+ bool found = FALSE;
+
+ for (curr = mbr_first; curr != NULL; curr = next)
+ {
+ next = curr->next;
+
+ if (!str_cmp(argument, curr->name))
+ {
+ UNLINK(curr, mbr_first, mbr_last, next, prev);
+
+ free_mbr(curr);
+ save_members();
+ found = TRUE;
+ }
+ }
+ if (!found)
+ chprintlnf(ch, "Error deleting %s.", argument);
+ else
+ chprintlnf(ch, "%s removed from member list.", argument);
+ return;
+ }
+
+ if ((clan = clan_lookup(arg)) == -1)
+ {
+ chprintln(ch, "That clan does not exist.");
+ return;
+ }
+
+ if (clan_table[clan].independent)
+ {
+ chprintln(ch, "That is not a real clan.");
+ return;
+ }
+
+ chprintlnf(ch, "{W%s{x\n\r",
+ stringf(0, ALIGN_CENTER, "-", FORMATF("[ %s{W Roster ]",
+ clan_table
+ [clan].who_name)));
+ for (i = MAX_RANK - 1; i >= 0; i--)
+ {
+ chprintf(ch, "%s%12ss {W:%s", rcol[i],
+ clan_table[clan].rank[i].rankname, rcol[i]);
+ buf[0] = '\0';
+ buf2[0] = '\0';
+ count = 0;
+ for (pmbr = mbr_first; pmbr != NULL; pmbr = pmbr->next)
+ {
+ if (pmbr->rank != i || pmbr->clan != clan || IS_NULLSTR(pmbr->name))
+ continue;
+ sprintf(buf2, " %s%12s {W({wLvl:{R%3d{W) ", rcol[i],
+ pmbr->name, pmbr->level);
+ strcat(buf, buf2);
+ if (++count % 2 == 0)
+ {
+ sprintf(buf2, "\n\r%15s", " ");
+ strcat(buf, buf2);
+ }
+ }
+ if (IS_NULLSTR(buf))
+ chprintlnf(ch, " %12s\n\r", "No one.");
+ else
+ {
+ sprintf(buf2, "\n\r%s", count % 2 != 0 ? "\n\r" : "");
+ strcat(buf, buf2);
+ chprint(ch, buf);
+ }
+ }
+ chprintlnf(ch, "{W%s", draw_line(NULL, 0));
+ return;
}
diff -ur src/comm.c new/comm.c
--- src/comm.c Sat Mar 15 18:39:12 2003
+++ new/comm.c Thu Mar 20 15:08:45 2003
@@ -1577,8 +1577,8 @@
((!IS_NPC(ch) &&
IS_SET(ch->act, PLR_HOLYLIGHT)) ||
(!IS_AFFECTED(ch, AFF_BLIND) &&
- !room_is_dark(ch->in_room))) ? ch->in_room->
- name : "darkness");
+ !room_is_dark(ch->in_room))) ? ch->
+ in_room->name : "darkness");
else
sprintf(buf2, " ");
i = buf2;
@@ -1879,8 +1879,8 @@
dold->connected != CON_GET_NAME &&
dold->connected != CON_GET_OLD_PASSWORD &&
!str_cmp(name,
- dold->original ? dold->original->name : dold->character->
- name))
+ dold->original ? dold->original->name : dold->
+ character->name))
{
write_to_buffer(d, "That character is already playing.\n\r", 0);
write_to_buffer(d, "Do you wish to connect anyway (Y/N)?", 0);
@@ -2290,6 +2290,197 @@
}
return;
+}
+
+const char *perform_act_string(const char *orig, CHAR_DATA * ch,
+ const void *arg1, const void *arg2, bool cReturn)
+{
+ static char *const he_she[] = { "it", "he", "she" };
+ static char *const him_her[] = { "it", "him", "her" };
+ static char *const his_her[] = { "its", "his", "her" };
+ CHAR_DATA *vch = (CHAR_DATA *) arg2;
+ OBJ_DATA *obj1 = (OBJ_DATA *) arg1;
+ OBJ_DATA *obj2 = (OBJ_DATA *) arg2;
+ const char *str, *i = NULL;
+ char *point;
+ static char buf[MSL];
+
+ point = buf;
+ str = orig;
+
+ while (*str != '\0')
+ {
+ if (*str != '$')
+ {
+ *point++ = *str++;
+ continue;
+ }
+
+ ++str;
+ i = "<@@@>";
+ if (!arg2 && *str >= 'A' && *str <= 'Z')
+ {
+ logf("perform_act:missing arg2 for code %d.", *str);
+ i = " <@@@> ";
+ }
+ else
+ {
+ switch (*str)
+ {
+ default:
+ logf("perform_act:bad code %c.", *str);
+ i = " <@@@> ";
+ break;
+
+ case '$':
+ i = "$";
+ break;
+ case 't':
+ if (arg1)
+ {
+ i = (const char *) arg1;
+ }
+ else
+ log_string("perform_act:bad code $t for 'arg1'");
+ break;
+ case 'T':
+ if (arg2)
+ i = (const char *) arg2;
+ else
+ log_string("perform_act:bad code $T for 'arg2'");
+ break;
+ case 'n':
+ if (ch)
+ i = IS_NPC(ch) ? ch->short_descr : ch->name;
+ else
+ log_string("perform_act:bad code $n for 'ch'");
+ break;
+ case 'N':
+ if (vch)
+ i = IS_NPC(vch) ? vch->short_descr : vch->name;
+ else
+ log_string("perform_act:bad code $N for 'vch'");
+ break;
+ case 'e':
+ if (ch)
+ i = he_she[URANGE(0, ch->sex, 2)];
+ else
+ log_string("perform_act:bad code $e for 'ch'");
+ break;
+ case 'E':
+ if (vch)
+ i = he_she[URANGE(0, vch->sex, 2)];
+ else
+ log_string("perform_act:bad code $E for 'vch'");
+ break;
+ case 'm':
+ if (ch)
+ i = him_her[URANGE(0, ch->sex, 2)];
+ else
+ log_string("perform_act:bad code $m for 'ch'");
+ break;
+ case 'M':
+ if (vch)
+ i = him_her[URANGE(0, vch->sex, 2)];
+ else
+ log_string("perform_act:bad code $M for 'vch'");
+ break;
+ case 's':
+ if (ch)
+ i = his_her[URANGE(0, ch->sex, 2)];
+ else
+ log_string("perform_act:bad code $s for 'ch'");
+ break;
+ case 'S':
+ if (vch)
+ i = his_her[URANGE(0, vch->sex, 2)];
+ else
+ log_string("perform_act:bad code $S for 'vch'");
+ break;
+ case 'g':
+ if (ch && ch->deity != -1)
+ i = deity_table[ch->deity].name;
+ else
+ log_string("perform_act:bad code $g for 'ch'");
+ break;
+ case 'G':
+ if (vch && vch->deity != -1)
+ i = deity_table[vch->deity].name;
+ else
+ log_string("perform_act:bad code $G for 'vch'");
+ break;
+ case 'c':
+ if (ch && ch->clan != -1)
+ i = clan_table[ch->clan].name;
+ else
+ log_string("perform_act:bad code $c for 'ch'");
+ break;
+ case 'C':
+ if (vch && vch->clan != -1)
+ i = clan_table[vch->clan].name;
+ else
+ log_string("perform_act:bad code $C for 'vch'");
+ break;
+ case 'o':
+ if (obj1)
+ i = fname(obj1->name);
+ else
+ log_string("perform_act:bad code $o for 'to' and 'obj1'");
+ break;
+
+ case 'O':
+ if (obj2)
+ i = fname(obj2->name);
+ else
+ log_string("perform_act:bad code $O for 'obj2'");
+ break;
+
+ case 'p':
+ if (obj1)
+ i = obj1->short_descr;
+ else
+ log_string("perform_act:bad code $p for 'obj1'");
+ break;
+
+ case 'P':
+ if (obj2)
+ i = obj2->short_descr;
+ else
+ log_string("perform_act:bad code $P for 'obj2'");
+ break;
+
+ case 'd':
+ if (arg2 == NULL || ((const char *) arg2)[0] == '\0')
+ {
+ i = "door";
+ }
+ else
+ {
+ char name[MIL];
+
+ one_argument((const char *) arg2, name);
+ i = name;
+ }
+ break;
+ }
+ }
+
+ ++str;
+ while ((*point = *i) != '\0')
+ ++point, ++i;
+ }
+
+ *point++ = '{';
+ *point++ = 'x';
+ if (cReturn)
+ {
+ *point++ = '\n';
+ *point++ = '\r';
+ }
+ *point = '\0';
+ buf[0] = UPPER(buf[0]);
+
+ return buf;
}
#define SENDOK(ch, type) ((IS_NPC(ch) || ((ch)->desc && (ch->desc->connected == CON_PLAYING))) \
diff -ur src/db.c new/db.c
--- src/db.c Sat Mar 15 18:39:12 2003
+++ new/db.c Thu Mar 20 15:08:45 2003
@@ -219,6 +219,9 @@
log_string("Loading races...");
load_races();
+ log_string("Loading clans...");
+ load_clans();
+ load_members();
/*
* Read in all the area files.
@@ -334,8 +337,6 @@
log_string("Loading socials...");
load_social_table();
load_gquest_data();
- log_string("Loading clans...");
- load_clans();
log_string("Loading commands...");
load_commands();
load_corpses();
@@ -362,15 +363,16 @@
{
AREA_DATA *pArea;
- alloc_mem(pArea, AREA_DATA, 1);
+ pArea = new_area();
+ free_string(pArea->file_name);
pArea->file_name = fread_string(fp);
pArea->area_flags = AREA_LOADING; /* OLC */
pArea->security = 9; /* OLC *//* 9 -- Hugin */
- pArea->builders = str_dup("None"); /* OLC */
pArea->vnum = top_area; /* OLC */
-
+ free_string(pArea->name);
pArea->name = fread_string(fp);
+ free_string(pArea->credits);
pArea->credits = fread_string(fp);
pArea->min_vnum = fread_number(fp);
pArea->max_vnum = fread_number(fp);
@@ -428,13 +430,12 @@
const char *word;
bool fMatch;
- alloc_mem(pArea, AREA_DATA, 1);
+ pArea = new_area();
pArea->age = 15;
pArea->nplayer = 0;
+ free_string(pArea->file_name);
pArea->file_name = str_dup(strArea);
pArea->vnum = top_area;
- pArea->name = str_dup("New Area");
- pArea->builders = str_dup("");
pArea->security = 9; /* 9 -- Hugin */
pArea->min_vnum = 0;
pArea->max_vnum = 0;
@@ -521,7 +522,9 @@
pHelp = new_help();
pHelp->level = level;
+ free_string(pHelp->keyword);
pHelp->keyword = keyword;
+ free_string(pHelp->text);
pHelp->text = fread_string(fp);
if (!str_cmp(pHelp->keyword, "greeting"))
@@ -576,13 +579,17 @@
}
fBootDb = TRUE;
- alloc_mem(pMobIndex, MOB_INDEX_DATA, 1);
+ pMobIndex = new_mob_index();
pMobIndex->vnum = vnum;
pMobIndex->area = current_area; /* OLC */
pMobIndex->new_format = FALSE;
+ free_string(pMobIndex->player_name);
pMobIndex->player_name = fread_string(fp);
+ free_string(pMobIndex->short_descr);
pMobIndex->short_descr = fread_string(fp);
+ free_string(pMobIndex->long_descr);
pMobIndex->long_descr = fread_string(fp);
+ free_string(pMobIndex->description);
pMobIndex->description = fread_string(fp);
/*
@@ -721,19 +728,21 @@
}
fBootDb = TRUE;
- alloc_mem(pObjIndex, OBJ_INDEX_DATA, 1);
+ pObjIndex = new_obj_index();
pObjIndex->vnum = vnum;
pObjIndex->area = current_area; /* OLC */
pObjIndex->new_format = FALSE;
pObjIndex->reset_num = 0;
+ free_string(pObjIndex->name);
pObjIndex->name = fread_string(fp);
+ free_string(pObjIndex->short_descr);
pObjIndex->short_descr = fread_string(fp);
+ free_string(pObjIndex->description);
pObjIndex->description = fread_string(fp);
/* Action description */ fread_string(fp);
/* pObjIndex->short_descr[0] = LOWER (pObjIndex->short_descr[0]);
pObjIndex->description[0] = UPPER (pObjIndex->description[0]); */
- pObjIndex->material = str_dup("");
pObjIndex->item_type = fread_number(fp);
pObjIndex->extra_flags = fread_flag(fp);
@@ -767,7 +776,7 @@
{
AFFECT_DATA *paf;
- alloc_mem(paf, AFFECT_DATA, 1);
+ paf = new_affect();
paf->where = TO_OBJECT;
paf->type = -1;
paf->level = 20; /* RT temp fix */
@@ -784,8 +793,10 @@
{
EXTRA_DESCR_DATA *ed;
- alloc_mem(ed, EXTRA_DESCR_DATA, 1);
+ ed = new_extra_descr();
+ free_string(ed->keyword);
ed->keyword = fread_string(fp);
+ free_string(ed->description);
ed->description = fread_string(fp);
LINK(ed, pObjIndex->first_extra_descr,
pObjIndex->last_extra_descr, next, prev);
@@ -985,14 +996,16 @@
fBootDb = TRUE;
alloc_mem(pRoomIndex, ROOM_INDEX_DATA, 1);
- pRoomIndex->owner = str_dup("");
+ pRoomIndex = new_room_index();
pRoomIndex->first_person = NULL;
pRoomIndex->clan = -1;
pRoomIndex->first_content = NULL;
pRoomIndex->first_extra_descr = NULL;
pRoomIndex->area = current_area;
pRoomIndex->vnum = vnum;
+ free_string(pRoomIndex->name);
pRoomIndex->name = fread_string(fp);
+ free_string(pRoomIndex->description);
pRoomIndex->description = fread_string(fp);
/* Area number */ fread_number(fp);
pRoomIndex->room_flags = fread_flag(fp);
@@ -1048,8 +1061,10 @@
exit(1);
}
- alloc_mem(pexit, EXIT_DATA, 1);
+ pexit = new_exit();
+ free_string(pexit->description);
pexit->description = fread_string(fp);
+ free_string(pexit->keyword);
pexit->keyword = fread_string(fp);
pexit->exit_info = 0;
pexit->rs_flags = 0; /* OLC */
@@ -1085,8 +1100,10 @@
{
EXTRA_DESCR_DATA *ed;
- alloc_mem(ed, EXTRA_DESCR_DATA, 1);
+ ed = new_extra_descr();
+ free_string(ed->keyword);
ed->keyword = fread_string(fp);
+ free_string(ed->description);
ed->description = fread_string(fp);
LINK(ed, pRoomIndex->first_extra_descr,
pRoomIndex->last_extra_descr, next, prev);
@@ -1110,7 +1127,7 @@
const char *word;
flag_t trigger = 0;
- alloc_mem(pRprog, PROG_LIST, 1);
+ pRprog = new_prog();
word = fread_word(fp);
if (!(trigger = flag_value(rprog_flags, word)))
{
@@ -1120,6 +1137,7 @@
SET_BIT(pRoomIndex->rprog_flags, trigger);
pRprog->trig_type = trigger;
pRprog->vnum = fread_number(fp);
+ free_string(pRprog->trig_phrase);
pRprog->trig_phrase = fread_string(fp);
LINK(pRprog, pRoomIndex->first_rprog, pRoomIndex->last_rprog,
next, prev);
@@ -1155,7 +1173,7 @@
MOB_INDEX_DATA *pMobIndex;
int iTrade;
- alloc_mem(pShop, SHOP_DATA, 1);
+ pShop = new_shop();
pShop->keeper = fread_number(fp);
if (pShop->keeper == 0)
break;
@@ -1392,8 +1410,9 @@
}
fBootDb = TRUE;
- alloc_mem(pMprog, PROG_CODE, 1);
+ pMprog = new_pcode();
pMprog->vnum = vnum;
+ free_string(pMprog->code);
pMprog->code = fread_string(fp);
LINK(pMprog, mprog_first, mprog_last, next, prev);
top_mprog_index++;
@@ -3163,6 +3182,27 @@
break;
case 3:
number += 1;
+ break;
+ }
+
+ return UMAX(1, number);
+}
+
+int number_fuzzier(int number)
+{
+ switch (number_range(0, 4))
+ {
+ case 0:
+ number -= 2;
+ break;
+ case 1:
+ number -= 1;
+ break;
+ case 3:
+ number += 1;
+ break;
+ case 4:
+ number += 2;
break;
}
diff -ur src/db2.c new/db2.c
--- src/db2.c Sat Mar 15 18:39:12 2003
+++ new/db2.c Thu Mar 20 15:08:45 2003
@@ -43,12 +43,15 @@
#include "interp.h"
#include "magic.h"
#include "recycle.h"
+#include "olc.h"
/* values for db2.c */
extern AREA_DATA *current_area;
int top_oprog_index;
int top_rprog_index;
+int nAllocPerm;
+long sAllocPerm;
/*
* Snarf a mob section. new style
@@ -68,6 +71,7 @@
vnum_t vnum;
char letter;
int iHash;
+ const char *tmp;
letter = fread_letter(fp);
if (letter != '#')
@@ -88,21 +92,22 @@
}
fBootDb = TRUE;
- alloc_mem(pMobIndex, MOB_INDEX_DATA, 1);
+ pMobIndex = new_mob_index();
pMobIndex->vnum = vnum;
pMobIndex->area = current_area; /* OLC */
pMobIndex->new_format = TRUE;
newmobs++;
+ free_string(pMobIndex->player_name);
pMobIndex->player_name = fread_string(fp);
+ free_string(pMobIndex->short_descr);
pMobIndex->short_descr = fread_string(fp);
+ free_string(pMobIndex->long_descr);
pMobIndex->long_descr = fread_string(fp);
+ free_string(pMobIndex->description);
pMobIndex->description = fread_string(fp);
- pMobIndex->race = race_lookup(fread_string(fp));
-
-/*
- pMobIndex->long_descr[0] = UPPER (pMobIndex->long_descr[0]);
- pMobIndex->description[0] = UPPER (pMobIndex->description[0]);
-*/
+ tmp = fread_string(fp);
+ pMobIndex->race = race_lookup(tmp);
+ free_string(tmp);
pMobIndex->act =
fread_flag(fp) | ACT_IS_NPC | race_table[pMobIndex->race].act;
@@ -204,7 +209,7 @@
char *word;
int trigger = 0;
- alloc_mem(pMprog, PROG_LIST, 1);
+ pMprog = new_prog();
word = fread_word(fp);
if ((trigger = flag_value(mprog_flags, word)) == 0)
{
@@ -214,6 +219,7 @@
SET_BIT(pMobIndex->mprog_flags, trigger);
pMprog->trig_type = trigger;
pMprog->vnum = fread_number(fp);
+ free_string(pMprog->trig_phrase);
pMprog->trig_phrase = fread_string(fp);
LINK(pMprog, pMobIndex->first_mprog, pMobIndex->last_mprog,
next, prev);
@@ -274,15 +280,19 @@
}
fBootDb = TRUE;
- alloc_mem(pObjIndex, OBJ_INDEX_DATA, 1);
+ pObjIndex = new_obj_index();
pObjIndex->vnum = vnum;
pObjIndex->area = current_area; /* OLC */
pObjIndex->new_format = TRUE;
pObjIndex->reset_num = 0;
newobjs++;
+ free_string(pObjIndex->name);
pObjIndex->name = fread_string(fp);
+ free_string(pObjIndex->short_descr);
pObjIndex->short_descr = fread_string(fp);
+ free_string(pObjIndex->description);
pObjIndex->description = fread_string(fp);
+ free_string(pObjIndex->material);
pObjIndex->material = fread_string(fp);
CHECK_POS(pObjIndex->item_type, item_lookup(fread_word(fp)),
@@ -383,7 +393,7 @@
{
AFFECT_DATA *paf;
- alloc_mem(paf, AFFECT_DATA, 1);
+ paf = new_affect();
paf->where = TO_OBJECT;
paf->type = -1;
paf->level = pObjIndex->level;
@@ -400,7 +410,7 @@
{
AFFECT_DATA *paf;
- alloc_mem(paf, AFFECT_DATA, 1);
+ paf = new_affect();
pletter = fread_letter(fp);
switch (pletter)
{
@@ -435,8 +445,10 @@
{
EXTRA_DESCR_DATA *ed;
- alloc_mem(ed, EXTRA_DESCR_DATA, 1);
+ ed = new_extra_descr();
+ free_string(ed->keyword);
ed->keyword = fread_string(fp);
+ free_string(ed->description);
ed->description = fread_string(fp);
LINK(ed, pObjIndex->first_extra_descr,
pObjIndex->last_extra_descr, next, prev);
@@ -448,7 +460,7 @@
const char *word;
flag_t trigger = 0;
- alloc_mem(pOprog, PROG_LIST, 1);
+ pOprog = new_prog();
word = fread_word(fp);
if (!(trigger = flag_value(oprog_flags, word)))
{
@@ -458,6 +470,7 @@
SET_BIT(pObjIndex->oprog_flags, trigger);
pOprog->trig_type = trigger;
pOprog->vnum = fread_number(fp);
+ free_string(pOprog->trig_phrase);
pOprog->trig_phrase = fread_string(fp);
LINK(pOprog, pObjIndex->first_oprog, pObjIndex->last_oprog,
next, prev);
@@ -851,12 +864,19 @@
IMP_COUNTER( type, prefix##free, f )
// these object types have no global list
-IMP_COUNTER(PC_DATA, pcdata_free, f) IMP_COUNTER(AFFECT_DATA, affect_free, f)
+// *INDENT-OFF*
+
+IMP_COUNTER(PC_DATA, pcdata_free, f)
+IMP_COUNTER(AFFECT_DATA, affect_free, f)
+
// these do
#define object_free obj_free
- IMP_LIST_COUNTERS(OBJ_DATA, object_);
+IMP_LIST_COUNTERS(OBJ_DATA, object_);
IMP_LIST_COUNTERS(CHAR_DATA, char_);
IMP_LIST_COUNTERS(DESCRIPTOR_DATA, descriptor_);
+IMP_LIST_COUNTERS(MBR_DATA, mbr_);
+
+// *INDENT-ON*
int nNOTE_DATA(void)
{
@@ -910,6 +930,7 @@
rpt("Areas", top_area, AREA_DATA);
rpt("Resets", top_reset, RESET_DATA);
rpt("Help entries", top_help, HELP_DATA);
+ rpt_dy("Members", MBR_DATA);
rpt_dy("Notes", NOTE_DATA);
rpt("Socials", maxSocial, struct social_type);
chprint(ch, separator);
@@ -927,6 +948,7 @@
rptf("Descriptors", DESCRIPTOR_DATA);
rptf("Objects", OBJ_DATA);
rptf("Affects", AFFECT_DATA);
+ rptf("Members", MBR_DATA);
chprint(ch, separator);
}
@@ -937,6 +959,8 @@
rptsd("String Space allocated at DB boot", MAX_STRING / 1024);
rptdsd(nAllocString, "Strings in string space", sAllocString / 1024);
rptsd("Excess string space", MAX_STRING / 1024 - sAllocString / 1024);
+ chprintlnf(ch, " Perms %d blocks of %ld kb.",
+ nAllocPerm, sAllocPerm / 1024);
chprint(ch, separator);
}
@@ -1210,8 +1234,9 @@
}
fBootDb = TRUE;
- alloc_mem(pOprog, PROG_CODE, 1);
+ pOprog = new_pcode();
pOprog->vnum = vnum;
+ free_string(pOprog->code);
pOprog->code = fread_string(fp);
LINK(pOprog, oprog_first, oprog_last, next, prev);
top_oprog_index++;
@@ -1253,8 +1278,9 @@
}
fBootDb = TRUE;
- alloc_mem(pRprog, PROG_CODE, 1);
+ pRprog = new_pcode();
pRprog->vnum = vnum;
+ free_string(pRprog->code);
pRprog->code = fread_string(fp);
LINK(pRprog, rprog_first, rprog_last, next, prev);
top_rprog_index++;
@@ -1424,4 +1450,42 @@
return 1;
return strcmp(cmd1.name, cmd2.name);
+}
+
+#define MAX_PERM_BLOCK 131072
+/*
+ * Allocate some permanent memory.
+ * Permanent memory is never freed,
+ * pointers into it may be copied safely.
+ */
+void *alloc_perm(size_t sMem)
+{
+ static char *pMemPerm;
+ static int iMemPerm;
+ void *pMem;
+
+ while (sMem % sizeof(long) != 0)
+ sMem++;
+ if (sMem > MAX_PERM_BLOCK)
+ {
+ bugf("%d too large.", sMem);
+ exit(1);
+ }
+
+ if (pMemPerm == NULL || iMemPerm + sMem > MAX_PERM_BLOCK)
+ {
+ iMemPerm = 0;
+ if ((pMemPerm = (char *) calloc(1, MAX_PERM_BLOCK)) == NULL)
+ {
+ perror("Alloc_perm");
+ exit(1);
+ }
+ }
+
+ pMem = pMemPerm + iMemPerm;
+ iMemPerm += sMem;
+ nAllocPerm += 1;
+ sAllocPerm += sMem;
+
+ return pMem;
}
diff -ur src/dofun.h new/dofun.h
--- src/dofun.h Sat Mar 15 18:39:12 2003
+++ new/dofun.h Thu Mar 20 15:08:46 2003
@@ -321,5 +321,7 @@
COMMAND_FUN (do_punload)
COMMAND_FUN (do_buddy)
COMMAND_FUN (do_btalk)
+COMMAND_FUN (do_areaset)
+COMMAND_FUN (do_roster)
// *INDENT-ON*
diff -ur src/globals.h new/globals.h
--- src/globals.h Sat Mar 15 18:39:12 2003
+++ new/globals.h Thu Mar 20 15:08:46 2003
@@ -117,11 +117,15 @@
GLOBAL_DEF(DESCRIPTOR_DATA * descriptor_free, NULL);
GLOBAL_DEF(OBJ_DATA * obj_free, NULL);
GLOBAL_DEF(AFFECT_DATA * affect_free, NULL);
+GLOBAL_DEF(MBR_DATA * mbr_free, NULL);
GLOBAL_DEF(int arena, FIGHT_OPEN);
GLOBAL_DEF(int maxDeity, 1);
GLOBAL_DEF(struct deity_type *deity_table, NULL);
GLOBAL_DEF(WPWD_DATA * wpwd_first, NULL);
GLOBAL_DEF(WPWD_DATA * wpwd_last, NULL);
+
+GLOBAL_DEF(MBR_DATA * mbr_first, NULL);
+GLOBAL_DEF(MBR_DATA * mbr_last, NULL);
#endif
diff -ur src/merc.h new/merc.h
--- src/merc.h Sat Mar 15 18:39:12 2003
+++ new/merc.h Thu Mar 20 15:08:46 2003
@@ -147,6 +147,7 @@
typedef struct clan_rank RANK_DATA;
typedef struct deity_type DEITY_DATA;
typedef struct wpwd_data WPWD_DATA;
+typedef struct mbr_data MBR_DATA;
/*
* Function types.
@@ -1561,6 +1562,17 @@
long gamestat[MAX_GAMESTAT]; // stat data
};
+struct mbr_data
+{
+ MBR_DATA *next;
+ MBR_DATA *prev;
+ bool valid;
+ const char *name;
+ int rank;
+ int clan;
+ int level;
+};
+
/*
* One character (PC or NPC).
*/
@@ -1672,6 +1684,24 @@
#define FIGHT_BUSY 2
#define FIGHT_LOCK 3
+#define LAST_PAGE_LENGTH 20
+
+#define LAST_NONE -1
+#define LAST_IMMTALK 0
+#define LAST_GOSSIP 1
+#define LAST_QA 2
+#define LAST_MUSIC 3
+#define LAST_CLANTALK 4
+#define LAST_QUOTE 5
+#define LAST_GRATS 6
+#define LAST_BTALK 7
+#define LAST_OOC 8
+#define LAST_MAX 9
+
+#define CHANNEL_NORMAL 0
+#define CHANNEL_SOCIAL 1
+#define CHANNEL_EMOTE 2
+
/*
* Data which only PC's have.
*/
@@ -1732,6 +1762,7 @@
const char *webpass;
char str_ed_key;
const char *buddies[MAX_BUDDY];
+ const char *history[LAST_MAX][LAST_PAGE_LENGTH];
};
/* Data for generating characters -- only used during generation */
@@ -2402,6 +2433,7 @@
#define BANK_FILE DATA_DIR "bank.dat"
#define DEITY_FILE DATA_DIR "deity.dat"
#define WPWD_FILE DATA_DIR "webpass.dat"
+#define MBR_FILE DATA_DIR "mbr.dat"
#include "proto.h"
diff -ur src/olc.c new/olc.c
--- src/olc.c Sat Mar 15 18:39:12 2003
+++ new/olc.c Thu Mar 20 15:08:46 2003
@@ -52,6 +52,7 @@
#include "olc.h"
#include "interp.h"
#include "lookup.h"
+#include "recycle.h"
MOB_INDEX_DATA xMob;
OBJ_INDEX_DATA xObj;
@@ -488,6 +489,9 @@
(const void *) position_flags},
{"defaultpos", (void *) &xMob.default_pos, olced_flag,
(const void *) position_flags},
+ {"autoeasy", NULL, olced_olded, (const void *) medit_autoeasy},
+ {"autoset", NULL, olced_olded, (const void *) medit_autoset},
+ {"autohard", NULL, olced_olded, (const void *) medit_autohard},
{"damtype", (void *) &xMob.dam_type, olced_poslookup,
(const void *) attack_lookup},
{"race", (void *) &xMob, olced_race, NULL},
@@ -513,6 +517,8 @@
{"addaffect", NULL, olced_olded, (const void *) oedit_addaffect},
{"addapply", NULL, olced_olded, (const void *) oedit_addapply},
{"delaffect", NULL, olced_olded, (const void *) oedit_delaffect},
+ {"autoweapon", NULL, olced_olded, (const void *) oedit_autoweapon},
+ {"autoarmor", NULL, olced_olded, (const void *) oedit_autoarmor},
{"v0", NULL, olced_value, (const void *) 0},
{"v1", NULL, olced_value, (const void *) 1},
{"v2", NULL, olced_value, (const void *) 2},
@@ -2815,4 +2821,351 @@
act("You are now entering the $t editor, type 'done' to finish.", ch,
olc_ed_name_long(ch), NULL, TO_CHAR);
}
+}
+
+void autoset(MOB_INDEX_DATA * pMob)
+{
+ double roll, size, bonus, avg;
+ double ac_n, ac_x;
+ int level;
+
+ if (!pMob || pMob->level < 1)
+ return;
+
+ level = pMob->level;
+
+ bonus = UMAX(1, (number_fuzzier(level) - 5));
+ ac_n =
+ 80 - (level * (7.77 + (level / 90))) - ((level / 9) ^ 2) - (bonus * 2);
+ ac_x =
+ 80 - (level * (6.67 + (level / 90))) - ((level / 9) ^ 2) - (bonus * 2);
+ pMob->ac[AC_PIERCE] = (int) ac_n;
+ pMob->ac[AC_BASH] = (int) ac_n;
+ pMob->ac[AC_SLASH] = (int) ac_n;
+ pMob->ac[AC_EXOTIC] = (int) ac_x;
+
+ pMob->mana[DICE_NUMBER] = number_fuzzier(level);
+ pMob->mana[DICE_TYPE] = number_fuzzier(10);
+ pMob->mana[DICE_BONUS] = number_fuzzier(85);
+
+ avg = (number_fuzzier(level) * .84);
+ roll = (number_fuzzier(level) / 9 + 1);
+ size = (number_fuzzier((int) roll) / 3);
+
+ for (size = roll / 3; roll * (size + 2) / 2 < avg; size++);
+
+ pMob->damage[DICE_NUMBER] = (int) UMAX(1, roll);
+ pMob->damage[DICE_TYPE] = (int) UMAX(2, size);
+ pMob->damage[DICE_BONUS] = (int) UMAX(1, number_fuzzier(level) * .89);
+
+ bonus =
+ UMAX(1,
+ (level / 53 + 1) * ((level * 10) + (level / 10)) - UMIN(20,
+ (2 *
+ level))
+ + 1);
+
+ size = number_fuzzier(level) * 1.2 - number_fuzzier(1);
+
+ roll = number_fuzzier(level) * 1.4 - number_fuzzier(2);
+
+ pMob->hit[DICE_NUMBER] = (int) UMAX(1, roll);
+ pMob->hit[DICE_TYPE] = (int) UMAX(2, size);
+ pMob->hit[DICE_BONUS] = (int) UMAX(10, bonus);
+
+ pMob->hitroll = number_range(level * 6 / 10, level);
+}
+
+void autohard(MOB_INDEX_DATA * pMob)
+{
+ double roll, size, bonus, avg;
+ double ac_n, ac_x;
+ int level;
+
+ if (!pMob || pMob->level < 1)
+ return;
+
+ level = pMob->level;
+
+ bonus = UMAX(1, (number_fuzzier(level) - 5));
+ ac_n =
+ 70 - (level * (8.15 + (level / 90))) - ((level / 8) ^ 2) - (bonus * 2);
+ ac_x =
+ 70 - (level * (7.12 + (level / 90))) - ((level / 8) ^ 2) - (bonus * 2);
+ pMob->ac[AC_PIERCE] = (int) ac_n;
+ pMob->ac[AC_BASH] = (int) ac_n;
+ pMob->ac[AC_SLASH] = (int) ac_n;
+ pMob->ac[AC_EXOTIC] = (int) ac_x;
+
+ pMob->mana[DICE_NUMBER] = number_fuzzier(level);
+ pMob->mana[DICE_TYPE] = number_fuzzier(12);
+ pMob->mana[DICE_BONUS] = number_fuzzier(95);
+
+ avg = (number_fuzzier(level) * .9);
+ roll = (number_fuzzier(level) / 9 + 1);
+ size = (number_fuzzier((int) roll) / 3);
+
+ for (size = roll / 3; roll * (size + 2) / 2 < avg; size++);
+
+ pMob->damage[DICE_NUMBER] = (int) UMAX(1, roll);
+ pMob->damage[DICE_TYPE] = (int) UMAX(2, size);
+ pMob->damage[DICE_BONUS] = (int) UMAX(1, number_fuzzier(level) * .99);
+
+ bonus = (level / 53 + 1) * ((level * 10) + (level / 10)) + 1;
+
+ size = number_fuzzier(level) * 1.2 - number_fuzzier(1);
+
+ size++;
+
+ roll = number_fuzzier(level) * 1.4 - number_fuzzier(2);
+
+ pMob->hit[DICE_NUMBER] = (int) UMAX(1, roll);
+ pMob->hit[DICE_TYPE] = (int) UMAX(2, size);
+ pMob->hit[DICE_BONUS] = (int) UMAX(10, bonus);
+
+ pMob->hitroll = number_range(level * 65 / 100, level);
+}
+
+void autoeasy(MOB_INDEX_DATA * pMob)
+{
+ double roll, size, bonus, avg;
+ double ac_n, ac_x;
+ int level;
+
+ if (!pMob || pMob->level < 1)
+ return;
+
+ level = pMob->level;
+
+ bonus = UMAX(1, (number_fuzzier(level) - 5));
+ ac_n =
+ 90 - (level * (7.47 + (level / 90))) - ((level / 10) ^ 2) - (bonus * 2);
+ ac_x =
+ 90 - (level * (6.37 + (level / 90))) - ((level / 10) ^ 2) - (bonus * 2);
+ pMob->ac[AC_PIERCE] = (int) ac_n;
+ pMob->ac[AC_BASH] = (int) ac_n;
+ pMob->ac[AC_SLASH] = (int) ac_n;
+ pMob->ac[AC_EXOTIC] = (int) ac_x;
+
+ pMob->mana[DICE_NUMBER] = number_fuzzier(level);
+ pMob->mana[DICE_TYPE] = number_fuzzier(10);
+ pMob->mana[DICE_BONUS] = number_fuzzier(60);
+
+ avg = (number_fuzzier(level) * .76);
+ roll = (number_fuzzier(level) / 9 + 1);
+ size = (number_fuzzier((int) roll) / 3);
+
+ for (size = roll / 3; roll * (size + 2) / 2 < avg; size++);
+
+ pMob->damage[DICE_NUMBER] = (int) UMAX(1, roll);
+ pMob->damage[DICE_TYPE] = (int) UMAX(2, size);
+ pMob->damage[DICE_BONUS] = (int) UMAX(1, number_fuzzier(level) * .82);
+
+ bonus =
+ UMAX(1,
+ (level / 55 + 1) * ((level * 9) + (level / 10)) - UMIN(20,
+ (1.5 *
+ level))
+ + 1);
+
+ size = number_fuzzier(level) * 1.2 - number_fuzzier(1);
+
+ roll = number_fuzzier(level) * 1.4 - number_fuzzier(2);
+
+ pMob->hit[DICE_NUMBER] = (int) UMAX(1, roll);
+ pMob->hit[DICE_TYPE] = (int) UMAX(2, size);
+ pMob->hit[DICE_BONUS] = (int) UMAX(10, bonus);
+
+ pMob->hitroll = number_range(level * 59 / 100, level);
+}
+
+void autoweapon(OBJ_INDEX_DATA * pObj)
+{
+ AFFECT_DATA *pAf, *pObjAf;
+ bool bDamroll, bHitroll;
+ double pDice, size, bonus;
+ int level, mod;
+
+ if (!pObj || pObj->item_type != ITEM_WEAPON)
+ return;
+
+ if (pObj->level < 1 || IS_OBJ_STAT(pObj, ITEM_QUEST))
+ return;
+
+ level = pObj->level;
+
+ bonus = UMAX(1, number_fuzzier(level) / 9 - 1);
+ pDice = (number_fuzzier(level) * .22 + 2);
+ size = (number_fuzzier((int) pDice) / 2);
+
+ for (size = pDice / 2; pDice * (size + 2) / 2 < level; size++);
+
+ pDice = UMAX(2, pDice);
+ size = UMAX(3, size);
+
+ switch (pObj->value[0])
+ {
+ default:
+ case WEAPON_EXOTIC:
+ case WEAPON_SWORD:
+ break;
+ case WEAPON_DAGGER:
+ pDice = UMAX(2, pDice - 1);
+ size = UMAX(3, size - 1);
+ break;
+ case WEAPON_SPEAR:
+ case WEAPON_POLEARM:
+ size++;
+ break;
+ case WEAPON_MACE:
+ case WEAPON_AXE:
+ size = UMAX(3, size - 1);
+ break;
+ case WEAPON_FLAIL:
+ case WEAPON_WHIP:
+ pDice = UMAX(2, pDice - 1);
+ break;
+ }
+
+ pDice += 1;
+ size -= 1;
+
+ pDice = UMAX(2, number_fuzzier((int) pDice));
+ size = UMAX(3, number_fuzzier((int) size));
+
+ pObj->value[1] = (long) pDice;
+ pObj->value[2] = (long) size;
+
+ mod = UMAX(1, number_range(number_fuzzier((int) bonus) * 6 / 10,
+ number_fuzzier((int) bonus)));
+
+ if(mod > 0)
+ {
+
+ bDamroll = FALSE;
+ bHitroll = FALSE;
+
+ for (pObjAf = pObj->first_affect; pObjAf; pObjAf = pObjAf->next)
+ {
+ if (pObjAf->location == APPLY_DAMROLL)
+ {
+ pObjAf->level = level;
+ pObjAf->modifier = mod;
+ bDamroll = TRUE;
+ }
+ else if (pObjAf->location == APPLY_HITROLL)
+ {
+ pObjAf->level = level;
+ pObjAf->modifier = mod;
+ bHitroll = TRUE;
+ }
+ }
+
+ if (!bDamroll)
+ {
+ pAf = new_affect();
+ pAf->location = APPLY_DAMROLL;
+ pAf->modifier = mod;
+ pAf->where = TO_OBJECT;
+ pAf->type = -1;
+ pAf->duration = -1;
+ pAf->bitvector = 0;
+ pAf->level = level;
+ LINK(pAf, pObj->first_affect, pObj->last_affect, next, prev);
+ }
+
+ if (!bHitroll)
+ {
+ pAf = new_affect();
+ pAf->location = APPLY_HITROLL;
+ pAf->modifier = mod;
+ pAf->where = TO_OBJECT;
+ pAf->type = -1;
+ pAf->duration = -1;
+ pAf->bitvector = 0;
+ pAf->level = level;
+ LINK(pAf, pObj->first_affect, pObj->last_affect, next, prev);
+ }
+ }
+}
+
+void autoarmor(OBJ_INDEX_DATA * pObj)
+{
+ int size;
+ int level;
+
+ if (!pObj || pObj->item_type != ITEM_ARMOR)
+ return;
+
+ if (pObj->level < 1 || IS_OBJ_STAT(pObj, ITEM_QUEST))
+ return;
+
+ level = pObj->level;
+
+ size = UMAX(1, number_fuzzier(level) / 2 + 1);
+
+ pObj->value[0] = size;
+ pObj->value[1] = size;
+ pObj->value[2] = size;
+ pObj->value[3] = (size - 1);
+}
+
+void area_set_auto(AREA_DATA * pArea)
+{
+ OBJ_INDEX_DATA *pObjIndex;
+ MOB_INDEX_DATA *pMobIndex;
+ vnum_t vnum;
+
+ if (!pArea)
+ return;
+
+ for (vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++)
+ {
+ if ((pMobIndex = get_mob_index(vnum)) != NULL && pMobIndex->level >= 1)
+ {
+ if (pMobIndex->level < 9)
+ autoeasy(pMobIndex);
+ else if (pMobIndex->level < 30)
+ autoset(pMobIndex);
+ else
+ autohard(pMobIndex);
+ }
+
+ if ((pObjIndex = get_obj_index(vnum)) != NULL
+ && !IS_OBJ_STAT(pObjIndex, ITEM_QUEST) && pObjIndex->level >= 1)
+ {
+
+ if (pObjIndex->item_type == ITEM_WEAPON)
+ autoweapon(pObjIndex);
+ else if (pObjIndex->item_type == ITEM_ARMOR)
+ autoarmor(pObjIndex);
+ }
+ }
+}
+
+CH_CMD(do_areaset)
+{
+ AREA_DATA *pArea;
+
+ if (!str_cmp(argument, "world"))
+ {
+ for (pArea = area_first; pArea; pArea = pArea->next)
+ area_set_auto(pArea);
+ chprintln(ch, "World set to default values.");
+ }
+ else if (ch->in_room != NULL && (pArea = ch->in_room->area) != NULL)
+ {
+ area_set_auto(pArea);
+ chprintlnf(ch, "%s set to default values.", pArea->name);
+ }
+ else
+ chprintln(ch, "Syntax: afun set world - set the whole world.\n\r"
+ " : afun set - set your current area.");
+
+ return;
}
diff -ur src/olc.h new/olc.h
--- src/olc.h Sat Mar 15 18:39:12 2003
+++ new/olc.h Thu Mar 20 15:08:46 2003
@@ -277,6 +277,8 @@
DECLARE_OLC_FUN(oedit_delete);
DECLARE_OLC_FUN(oedit_addoprog);
DECLARE_OLC_FUN(oedit_deloprog);
+DECLARE_OLC_FUN(oedit_autoweapon);
+DECLARE_OLC_FUN(oedit_autoarmor);
/*
* Mobile Editor Prototypes
@@ -287,6 +289,9 @@
DECLARE_OLC_FUN(medit_group); /* ROM */
DECLARE_OLC_FUN(medit_addmprog); /* ROM */
DECLARE_OLC_FUN(medit_delmprog); /* ROM */
+DECLARE_OLC_FUN(medit_autoset);
+DECLARE_OLC_FUN(medit_autoeasy);
+DECLARE_OLC_FUN(medit_autohard);
/* Mobprog editor */
DECLARE_OLC_FUN(mpedit_create);
@@ -417,5 +422,11 @@
void sedit args((CHAR_DATA * ch, char *argument));
SOCIAL_DATA *get_social_data args((const char *name));
+
+void autoset args((MOB_INDEX_DATA * pMob));
+void autohard args((MOB_INDEX_DATA * pMob));
+void autoeasy args((MOB_INDEX_DATA * pMob));
+void autoarmor args((OBJ_INDEX_DATA * pObj));
+void autoweapon args((OBJ_INDEX_DATA * pObj));
#endif
diff -ur src/olc_act.c new/olc_act.c
--- src/olc_act.c Sat Mar 15 18:39:12 2003
+++ new/olc_act.c Thu Mar 20 15:08:46 2003
@@ -813,15 +813,16 @@
EDIT_AREA(ch, pArea);
chprintf(ch, "%s\n\r",
- stringf(0, ALIGN_CENTER, "-", "[ %s: %s ]", olc_ed_name(ch),
- olc_ed_vnum(ch)));
+ stringf(0, ALIGN_CENTER, "-",
+ FORMATF("[ %s: %s ]", olc_ed_name(ch), olc_ed_vnum(ch))));
chprintlnf(ch, "Name: [%5d] %s", pArea->vnum, pArea->name);
#if 0 /* ROM OLC */
chprintlnf(ch, "Recall: [%5d] %s", pArea->recall,
- get_room_index(pArea->recall) ? get_room_index(pArea->recall)->
- name : "none");
+ get_room_index(pArea->recall) ? get_room_index(pArea->
+ recall)->name :
+ "none");
#endif /* ROM */
chprintlnf(ch, "File: %s", pArea->file_name);
@@ -1126,8 +1127,8 @@
buf1[0] = '\0';
strcat(buf1,
- stringf(0, ALIGN_CENTER, "-", "[ %s: %s ]", olc_ed_name(ch),
- olc_ed_vnum(ch)));
+ stringf(0, ALIGN_CENTER, "-", FORMATF("[ %s: %s ]", olc_ed_name(ch),
+ olc_ed_vnum(ch))));
strcat(buf1, "\n\r");
sprintf(buf, "Description:\n\r%s", pRoom->description);
@@ -2067,8 +2068,9 @@
"[v4] Weight Mult [%ld]", obj->value[0],
flag_string(container_flags, obj->value[1]),
get_obj_index(obj->value[2]) ? get_obj_index(obj->value
- [2])->short_descr
- : "none", obj->value[2], obj->value[3], obj->value[4]);
+ [2])->
+ short_descr : "none", obj->value[2], obj->value[3],
+ obj->value[4]);
break;
case ITEM_DRINK_CON:
@@ -2452,8 +2454,8 @@
EDIT_OBJ(ch, pObj);
chprintf(ch, "%s\n\r",
- stringf(0, ALIGN_CENTER, "-", "[ %s: %s ]", olc_ed_name(ch),
- olc_ed_vnum(ch)));
+ stringf(0, ALIGN_CENTER, "-",
+ FORMATF("[ %s: %s ]", olc_ed_name(ch), olc_ed_vnum(ch))));
chprintlnf(ch, "Name: [%s]\n\rArea: [%5d] %s",
pObj->name, !pObj->area ? -1 : pObj->area->vnum,
@@ -2902,8 +2904,8 @@
EDIT_MOB(ch, pMob);
chprintf(ch, "%s\n\r",
- stringf(0, ALIGN_CENTER, "-", "[ %s: %s ]", olc_ed_name(ch),
- olc_ed_vnum(ch)));
+ stringf(0, ALIGN_CENTER, "-",
+ FORMATF("[ %s: %s ]", olc_ed_name(ch), olc_ed_vnum(ch))));
chprintlnf(ch, "Name: [%s]\n\rArea: [%5d] %s",
pMob->player_name, !pMob->area ? -1 : pMob->area->vnum,
@@ -4535,7 +4537,7 @@
CEDIT(cedit_create)
{
- int j, i = maxClan;
+ int j, i = maxClan, x;
CLAN_DATA *pClan;
struct clan_type *new_table;
char buf[MIL];
@@ -4564,6 +4566,12 @@
clan_table[i].name = str_dup(buf);
clan_table[i].who_name = str_dup(buf);
+ for (x = 0; x < MAX_RANK; x++)
+ {
+ clan_table[i].rank[x].shortname = str_dup("---");
+ clan_table[i].rank[x].rankname = str_dup("Member");
+ }
+
pClan = &clan_table[i];
edit_start(ch, pClan, ED_CLAN);
chprintln(ch, "Clan created.");
@@ -4592,6 +4600,7 @@
int nMatch = 0;
ROOM_INDEX_DATA *pRoom;
vnum_t vnum;
+ MBR_DATA *pmbr, *next = NULL;
alloc_mem(new_table, struct clan_type, maxClan);
@@ -4603,6 +4612,19 @@
c = clan_lookup(pClan->name);
+ for (pmbr = mbr_first; pmbr != NULL; pmbr = next)
+ {
+ next = pmbr->next;
+
+ if (pmbr->clan == c)
+ {
+ UNLINK(pmbr, mbr_first, mbr_last, next, prev);
+ free_mbr(pmbr);
+ }
+ else if (pmbr->clan > c)
+ pmbr->clan -= 1;
+ }
+
for (pch = char_first; pch != NULL; pch = pch->next)
{
if (pch->clan == c)
@@ -4641,6 +4663,124 @@
edit_start(ch, pClan, ED_CLAN);
chprintln(ch, "Clan deleted.");
}
+
+ return TRUE;
+}
+
+OEDIT(oedit_autoweapon)
+{
+ OBJ_INDEX_DATA *pObj;
+
+ EDIT_OBJ(ch, pObj);
+
+ if (pObj->item_type != ITEM_WEAPON)
+ {
+ chprintln(ch, " {rAutoweapon only works on weapons...{x");
+ return FALSE;
+ }
+
+ if (pObj->level < 1)
+ {
+ chprintlnf
+ (ch,
+ " {cAutoweapon requires a level to be set on the weapon first(vnum %ld).{x",
+ pObj->vnum);
+ return FALSE;
+ }
+
+ if (IS_OBJ_STAT(pObj, ITEM_QUEST))
+ {
+ chprintln(ch, "This weapon cannot be autoset.");
+ return FALSE;
+ }
+
+ autoweapon(pObj);
+ chprintln(ch, "Weapon set to default values., check for accuracy.");
+
+ return TRUE;
+}
+
+OEDIT(oedit_autoarmor)
+{
+ OBJ_INDEX_DATA *pObj;
+
+ EDIT_OBJ(ch, pObj);
+
+ if (pObj->item_type != ITEM_ARMOR)
+ {
+ chprintln(ch, " {rAutoArmor only works on Armor ...{x");
+ return FALSE;
+ }
+
+ if (pObj->level < 1)
+ {
+ chprintlnf
+ (ch,
+ " {cAutoArmor requires a level to be set on the armor first.(vnum %ld){x",
+ pObj->vnum);
+ return FALSE;
+ }
+
+ if (IS_OBJ_STAT(pObj, ITEM_QUEST))
+ {
+ chprintln(ch, "This weapon cannot be autoset.");
+ return FALSE;
+ }
+
+ autoarmor(pObj);
+ chprintln(ch, "AutoArmor has set experimental values for AC.{x");
+ return TRUE;
+}
+
+MEDIT(medit_autoset)
+{
+ MOB_INDEX_DATA *pMob;
+
+ EDIT_MOB(ch, pMob);
+
+ if (pMob->level < 1)
+ {
+ chprintlnf(ch, "Set a level on the mob first!!!(vnum %ld)", pMob->vnum);
+ return FALSE;
+ }
+
+ autoset(pMob);
+ chprintln(ch, " Values set, check for accuracy.");
+ return TRUE;
+}
+
+MEDIT(medit_autohard)
+{
+ MOB_INDEX_DATA *pMob;
+
+ EDIT_MOB(ch, pMob);
+
+ if (pMob->level < 1)
+ {
+ chprintlnf(ch, "Set a level on the mob first!!!(vnum %ld)", pMob->vnum);
+ return FALSE;
+ }
+
+ autohard(pMob);
+
+ chprintln(ch, " Hard values set, check for accuracy.");
+
+ return TRUE;
+}
+
+MEDIT(medit_autoeasy)
+{
+ MOB_INDEX_DATA *pMob;
+
+ EDIT_MOB(ch, pMob);
+ if (pMob->level < 1)
+ {
+ chprintlnf(ch, "Set a level on the mob first!!!(vnum %ld)", pMob->vnum);
+ return FALSE;
+ }
+ autoeasy(pMob);
+
+ chprintln(ch, " Easy values set, check for accuracy.");
return TRUE;
}
diff -ur src/olc_save.c new/olc_save.c
--- src/olc_save.c Sat Mar 15 18:39:12 2003
+++ new/olc_save.c Thu Mar 20 15:08:46 2003
@@ -77,7 +77,7 @@
int i;
int o;
- if (str == NULL)
+ if (str == NULL || !str_cmp(str, "(null)"))
return '\0';
for (o = i = 0; str[i + o] != '\0'; i++)
diff -ur src/olc_social.c new/olc_social.c
--- src/olc_social.c Sat Mar 15 18:39:12 2003
+++ new/olc_social.c Thu Mar 20 15:08:46 2003
@@ -87,8 +87,8 @@
}
chprintf(ch, "%s\n\r",
- stringf(0, ALIGN_CENTER, "-", "[ %s: %s ]", olc_ed_name(ch),
- olc_ed_vnum(ch)));
+ stringf(0, ALIGN_CENTER, "-",
+ FORMATF("[ %s: %s ]", olc_ed_name(ch), olc_ed_vnum(ch))));
chprintf(ch, "Name : %s\n\r"
"(cnoarg): %s\n\r" "(onoarg): %s\n\r"
diff -ur src/proto.h new/proto.h
--- src/proto.h Sat Mar 15 18:39:12 2003
+++ new/proto.h Thu Mar 20 15:08:46 2003
@@ -62,13 +62,12 @@
const char *draw_line args((char *fill, int len));
const char *smash_colour args((const char *str));
const char *stringf
-args((int length, int align, const char *fill,
- const char *string, ...)) __attribute__ ((format(printf, 4, 5)));
+args((int length, int align, const char *fill, const char *string));
bool is_ansi_printed_char args((char c));
void public_ch args((CHAR_DATA * ch, const char *argument,
const char *type, flag_t bitname,
- enum special_flags spec_flag));
+ enum special_flags spec_flag, int last_type));
/* act_enter.c */
RID *get_random_room args((CHAR_DATA * ch));
@@ -119,6 +118,10 @@
const void *arg2, flag_t type, int min_pos));
void perform_act args((const char *orig, CHAR_DATA * ch, const void *arg1,
const void *arg2, flag_t type, CHAR_DATA * to));
+const char *perform_act_string
+args(
+ (const char *orig, CHAR_DATA * ch, const void *arg1, const void *arg2,
+ bool cReturn));
void chprintf args((CHAR_DATA *, char *, ...))
__attribute__ ((format(printf, 2, 3)));
@@ -159,6 +162,7 @@
const char *str_dup args((const char *str));
void free_string args((const char *pstr));
int number_fuzzy args((int number));
+int number_fuzzier args((int number));
int number_range args((int from, int to));
int number_percent args((void));
int number_door args((void));
@@ -557,6 +561,14 @@
int sort_socials args((void));
int sort_helps args((void));
int srt_skills args((const void *p1, const void *p2));
+
+char *FORMATF args((const char *formatbuf, ...))
+ __attribute__ ((format(printf, 1, 2)));
+void *alloc_perm args((size_t sMem));
+
+void save_members args((void));
+void update_members args((CHAR_DATA * ch, bool pdelete));
+void load_members args((void));
#undef CD
#undef MID
diff -ur src/recycle.c new/recycle.c
--- src/recycle.c Sat Mar 15 18:39:12 2003
+++ new/recycle.c Thu Mar 20 15:08:46 2003
@@ -304,6 +304,33 @@
return;
}
+void clear_history(PC_DATA * pcdata)
+{
+ int i;
+ int x;
+
+ for (i = 0; i < LAST_MAX; i++)
+ {
+ for (x = 0; x < LAST_PAGE_LENGTH; x++)
+ {
+ pcdata->history[i][x] = &str_empty[0];
+ }
+ }
+}
+
+void free_history(PC_DATA * pcdata)
+{
+ int i, x;
+
+ for (i = 0; i < LAST_MAX; i++)
+ {
+ for (x = 0; x < LAST_PAGE_LENGTH; x++)
+ {
+ free_string(pcdata->history[i][x]);
+ }
+ }
+}
+
PC_DATA *new_pcdata(void)
{
int alias, bud;
@@ -326,6 +353,7 @@
pcdata->buddies[bud] = NULL;
}
+ clear_history(pcdata);
pcdata->buffer = new_buf();
alloc_mem(pcdata->learned, int, maxSkill);
alloc_mem(pcdata->group_known, bool, maxGroup);
@@ -357,6 +385,9 @@
}
for (pos = 0; pos < MAX_BUDDY; pos++)
free_string(pcdata->buddies[pos]);
+
+ free_history(pcdata);
+
INVALIDATE(pcdata);
PUT_FREE(pcdata, next, pcdata_free);
@@ -698,4 +729,30 @@
INVALIDATE(pwd);
PUT_FREE(pwd, next, WPWD_free);
+}
+
+MBR_DATA *new_mbr(void)
+{
+ static MBR_DATA mbr_zero;
+ MBR_DATA *mbr;
+
+ GET_FREE(mbr, MBR_DATA, next, mbr_free);
+
+ *mbr = mbr_zero;
+ mbr->name = &str_empty[0];
+ mbr->clan = -1;
+ mbr->rank = 0;
+ VALIDATE(mbr);
+ return mbr;
+}
+
+void free_mbr(MBR_DATA * mbr)
+{
+ if (!IS_VALID(mbr))
+ return;
+
+ free_string(mbr->name);
+
+ INVALIDATE(mbr);
+ PUT_FREE(mbr, next, mbr_free);
}
diff -ur src/recycle.h new/recycle.h
--- src/recycle.h Sat Mar 15 18:39:12 2003
+++ new/recycle.h Thu Mar 20 15:08:46 2003
@@ -44,7 +44,7 @@
} \
else \
{ \
- alloc_mem(point, type, 1); \
+ point = (type *)alloc_perm(sizeof(*point)); \
}\
memset(point, 0, sizeof(*point)); \
} while(0)
@@ -143,5 +143,8 @@
void free_pwd args((WPWD_DATA * pwd));
WPWD_DATA *new_pwd args((void));
+
+MBR_DATA *new_mbr args((void));
+void free_mbr args((MBR_DATA * mbr));
#endif
diff -ur src/save.c new/save.c
--- src/save.c Sat Mar 15 18:39:12 2003
+++ new/save.c Thu Mar 20 15:08:46 2003
@@ -588,6 +588,7 @@
ch->pcdata->board = &boards[DEFAULT_BOARD];
ch->info_settings = INFO_QUIET; /* this actually turns quiet off */
ch->pcdata->pwd = str_dup("");
+ ch->pcdata->webpass = str_dup("");
ch->pcdata->bamfin = str_dup("");
ch->pcdata->bamfout = str_dup("");
ch->pcdata->title = str_dup("");
diff -ur src/string.c new/string.c
--- src/string.c Sat Mar 15 18:39:12 2003
+++ new/string.c Thu Mar 20 15:08:46 2003
@@ -1004,36 +1004,23 @@
return (result);
}
-const char *stringf(int length, int align,
- const char *fill, const char *string, ...)
+const char *stringf(int length, int align, const char *fill, const char *string)
{
- char buf[MSL];
- char buf2[MSL];
- char *fmt;
- char fmt2[MSL];
- char *new_string;
- char *count_string;
+ const char *count_string;
char temp;
int count = 0, nCount = 0;
int pos = 0;
- va_list args;
-
+ char *result;
static char buf_new[5][MSL];
static int i;
- char *result = buf_new[i];
// rotate buffers
++i;
i %= 5;
- fmt = fmt2;
- va_start(args, string);
- vsnprintf(fmt2, MSL, string, args);
- va_end(args);
+ result = buf_new[i];
- new_string = buf;
- count_string = buf2;
- strcpy(buf2, fmt);
+ count_string = string;
if (!fill)
fill = " ";
@@ -1062,7 +1049,7 @@
count = (length - ++nCount);
while (nCount++ <= length)
{
- buf[pos++] = *fill;
+ result[pos++] = *fill;
}
}
@@ -1072,18 +1059,18 @@
count = nCount;
while (nCount-- > 0)
{
- buf[pos++] = *fill;
+ result[pos++] = *fill;
}
}
- while (*fmt && count != length)
+ while (*string && count != length)
{
- temp = *fmt++;
- buf[pos++] = temp;
+ temp = *string++;
+ result[pos++] = temp;
if (temp == ANSI_KEY)
{
- temp = buf[pos] = *fmt++;
+ temp = result[pos] = *string++;
if (is_ansi_printed_char(temp))
count++;
@@ -1095,10 +1082,9 @@
}
while (count++ < length)
- buf[pos++] = *fill;
+ result[pos++] = *fill;
- buf[pos] = '\0';
- strcpy(result, new_string);
+ result[pos] = '\0';
return (result);
}
@@ -1282,4 +1268,20 @@
ch->pcdata->str_ed_key = argument[0];
chprintlnf(ch, "The string editor now uses %c for commands.",
STR_EDIT_KEY(ch));
+}
+
+char *FORMATF(const char *formatbuf, ...)
+{
+ static int i;
+ static char buf[10][MSL * 3];
+ va_list args;
+
+ ++i;
+ i %= 10;
+
+ va_start(args, formatbuf);
+ vsnprintf(buf[i], MSL * 3, formatbuf, args);
+ va_end(args);
+
+ return buf[i];
}
diff -ur src/tablesave.c new/tablesave.c
--- src/tablesave.c Sat Mar 15 18:39:12 2003
+++ new/tablesave.c Thu Mar 20 15:08:46 2003
@@ -80,6 +80,7 @@
GQUEST gq;
DEITY_DATA deity;
WPWD_DATA pwd;
+MBR_DATA mbr;
const char *do_fun_name(DO_FUN *);
DO_FUN *do_fun_lookup(const char *);
@@ -187,6 +188,26 @@
return !str_cmp(arg, "") || blah != NULL;
}
+const char *clan_str(void *temp)
+{
+ int *clan = (int *) temp;
+
+ return clan_table[*clan].name;
+}
+
+bool clan_read(void *temp, char *arg)
+{
+ int *posic = (int *) temp;
+ int ffg = clan_lookup(arg);
+
+ *posic = UMAX(0, ffg);
+
+ if (ffg == -1)
+ return FALSE;
+ else
+ return TRUE;
+}
+
const struct savetable_type cmdsavetable[] = {
{"name", FIELD_STRING, (void *) &cmd.name, NULL, NULL},
@@ -357,6 +378,15 @@
{NULL, 0, NULL, NULL, NULL}
};
+const struct savetable_type mbrsavetable[] = {
+ {"name", FIELD_STRING, (void *) &mbr.name, NULL, NULL},
+ {"clan", FIELD_FUNCION_INT_TO_STR, (void *) &mbr.clan, (void *) clan_str,
+ (void *) clan_read},
+ {"rank", FIELD_INT, (void *) &mbr.rank, NULL, NULL},
+ {"level", FIELD_INT, (void *) &mbr.level, NULL, NULL},
+ {NULL, 0, NULL, NULL, NULL}
+};
+
void load_struct(FILE * fp, void *typebase,
const struct savetable_type *table, void *puntero)
{
@@ -613,7 +643,7 @@
(const char **) ((int) temp->puntero_field - (int) typebase +
(int) puntero);
fprintf(fp, "%s\t\t%s~\n", temp->field,
- IS_NULLSTR(*pstring) ? "" : *pstring);
+ IS_NULLSTR(*pstring) ? "" : fix_string(*pstring));
break;
case FIELD_INT:
@@ -708,7 +738,8 @@
(int) puntero);
fprintf(fp, "%s\t\t", temp->field);
for (i = 0; i < (int) temp->argument; i++)
- fprintf(fp, "%s~ ", !IS_NULLSTR(pstring[i]) ? pstring[i] : "");
+ fprintf(fp, "%s~ ",
+ !IS_NULLSTR(pstring[i]) ? fix_string(pstring[i]) : "");
fprintf(fp, "@~\n");
break;
@@ -719,7 +750,8 @@
fprintf(fp, "%s\t\t", temp->field);
for (i = 0; i < (int) temp->argument && !IS_NULLSTR(pstring[i]);
i++)
- fprintf(fp, "%s~ ", !IS_NULLSTR(pstring[i]) ? pstring[i] : "");
+ fprintf(fp, "%s~ ",
+ !IS_NULLSTR(pstring[i]) ? fix_string(pstring[i]) : "");
fprintf(fp, "@~\n");
break;
@@ -744,7 +776,8 @@
{
fprintf(fp, "%s\t%s%d ", temp->field,
strlen(temp->field) < 8 ? "\t" : "", i + 1);
- fprintf(fp, "%s~ %s~\n", rdata[i].shortname, rdata[i].rankname);
+ fprintf(fp, "%s~ %s~\n", fix_string(rdata[i].shortname),
+ fix_string(rdata[i].rankname));
}
break;
@@ -1714,6 +1747,79 @@
ppwd = new_pwd();
load_struct(fp, &pwd, pwdsavetable, ppwd);
LINK(ppwd, wpwd_first, wpwd_last, next, prev);
+ }
+ file_close(fp);
+}
+
+void save_members(void)
+{
+ MBR_DATA *pmbr;
+ FILE *fp;
+#if !defined(WIN32)
+ char *TEMPFILE = MBR_FILE ".tmp";
+
+ if ((fp = file_open(TEMPFILE, "w")) == NULL)
+#else
+ if ((fp = file_open(MBR_FILE, "w")) == NULL)
+#endif
+ {
+ perror(MBR_FILE);
+ file_close(fp);
+ return;
+ }
+
+ for (pmbr = mbr_first; pmbr != NULL; pmbr = pmbr->next)
+ {
+ if (pmbr->clan < 0 || pmbr->clan >= maxClan)
+ {
+ bugf("%s member data invalid.", pmbr->name);
+ continue;
+ }
+ fprintf(fp, "#MBR\n");
+ save_struct(fp, &mbr, mbrsavetable, pmbr);
+ fprintf(fp, "#END\n\n");
+ }
+
+ fprintf(fp, "#!\n");
+
+ file_close(fp);
+
+#if !defined(WIN32)
+ rename(TEMPFILE, MBR_FILE);
+#endif
+}
+
+void load_members(void)
+{
+ FILE *fp;
+ MBR_DATA *pmbr;
+ const char *word;
+
+ fp = file_open(MBR_FILE, "r");
+
+ if (!fp)
+ {
+ bug("Unable to open " MBR_FILE " to load members.", 0);
+ save_members();
+ return;
+ }
+
+ for (;;)
+ {
+ word = fread_word(fp);
+
+ if (!str_cmp(word, "#!"))
+ break;
+
+ if (str_cmp(word, "#MBR"))
+ {
+ bugf("word doesn't exist (%s)", word);
+ exit(1);
+ }
+
+ pmbr = new_mbr();
+ load_struct(fp, &mbr, mbrsavetable, pmbr);
+ LINK(pmbr, mbr_first, mbr_last, next, prev);
}
file_close(fp);
}
diff -ur src/webserver.c new/webserver.c
--- src/webserver.c Sat Mar 15 18:39:12 2003
+++ new/webserver.c Thu Mar 20 15:08:46 2003
@@ -119,7 +119,6 @@
CH_CMD(do_webpass)
{
char arg1[MIL];
- char arg2[MIL];
char *pArg;
char *pwdnew;
char *p;
@@ -153,49 +152,22 @@
}
*pArg = '\0';
- pArg = arg2;
- while (isspace(*argument))
- argument++;
-
- cEnd = ' ';
- if (*argument == '\'' || *argument == '\"')
- cEnd = *argument++;
-
- while (*argument != '\0')
+ if (IS_NULLSTR(arg1))
{
- if (*argument == cEnd)
- {
- argument++;
- break;
- }
- *pArg++ = *argument++;
- }
- *pArg = '\0';
-
- if (IS_NULLSTR(arg1) || IS_NULLSTR(arg2))
- {
- chprintln(ch, "Syntax: webpass <old> <new>.");
+ chprintln(ch, "Syntax: webpass <new>.");
return;
}
write_to_descriptor(ch->desc, echo_off_str, 0);
- if (str_cmp(crypt(arg1, ch->pcdata->webpass), ch->pcdata->webpass))
- {
- WAIT_STATE(ch, 40);
- chprintln(ch, "Wrong password. Wait 10 seconds.");
- write_to_descriptor(ch->desc, echo_on_str, 0);
- return;
- }
-
- if (strlen(arg2) < 5)
+ if (strlen(arg1) < 5)
{
chprintln(ch, "New password must be at least five characters long.");
write_to_descriptor(ch->desc, echo_on_str, 0);
return;
}
- pwdnew = crypt(arg2, ch->name);
+ pwdnew = crypt(arg1, ch->name);
for (p = pwdnew; *p != '\0'; p++)
{
if (*p == '~')
@@ -1198,8 +1170,8 @@
else if (victim->in_room == victim->fighting->in_room)
{
strcat(buf,
- IS_NPC(victim) ? victim->fighting->
- short_descr : victim->fighting->name);
+ IS_NPC(victim) ? victim->fighting->short_descr : victim->
+ fighting->name);
strcat(buf, ".");
}
else