On Sat, 30 May 1998, Jesse Scott wrote:
->I was wondering what the best way to set up newbie eq is, I've looked
->around on the web and searched the source extensively, but I don't want
->to have to hard code in what they get, esp since vnums could change,
->should I set up a file that lists it and write something to equip them
->from the file or what? thanks for the help
Oi! _The_ question is back! I remember this stuff from well over a
year ago -- really vintage Mailer Code(tm), that (too bad code doesn't
ferment, eh?)
Okay, so this has a little different spin on it: you don't want hard
coded vnums (ehh, I can't see why you'd change the vnums of the newbie
equipment, though; just stick it all in the 0-99 range -- shouldn't
ever be a reason to move it). Okay, the basic code is (has always
been :),
int b_mage = (1 << CLASS_MAGIC_USER);
int b_cleric = (1 << CLASS_CLERIC);
int b_thief = (1 << CLASS_THIEF);
int b_warrior = (1 << CLASS_WARRIOR);
int b_class = (1 << GET_CLASS(ch));
int inv = -1, cont = -2;
int bag_vnum = 20;
struct obj_data * bag;
/* THIS IS JUST AN EXAMPLE LIST */
int eq_list[][4] = {
/* class(es) , vnum, amt, to */
{ 0 , 21, 1, inv }, /* newbie guide book */
{ b_warrior , 22, 1, WEAR_WIELD }, /* sword */
{ b_cleric | b_mage , 24, 1, WEAR_WIELD }, /* staff */
{ 0 , 12, 4, cont }, /* bread (in bag) */
{ -1, -1, -1, -1 } /* ALWAYS LAST */
};
int i, j;
bag = read_object(bag_vnum, VIRTUAL);
obj_to_char(bag, ch);
for (i = 0; eq_list[i][1] >= 0; i++)
if (!eq_list[i][0] || IS_SET(eq_list[i][0], b_class)) {
for (j = 0; j < eq_list[i][2]; j++) {
struct obj_data * tmp = read_object(eq_list[i][1], VIRTUAL);
if (!tmp) break;
if (eq_list[i][3] == cont && bag)
obj_to_obj(tmp, bag);
else if (eq_list[i][3] >= 0 && !EQ(ch, eq_list[i][3]))
equip_char(ch, tmp, eq_list[i][3]);
else
obj_to_char(tmp, ch);
}
}
If you want to move this list into a file, use a function like this,
/* ewww, structure */
struct eq_list_data {
int class_bitv;
obj_vnum vnum;
int amt;
int to;
};
/* global variable */
struct eq_list_data * eq_list = NULL;
void load_newbie_eq(void)
{
FILE * fp;
char line[256], flags[128];
int t[3], count = 0, i = 0;
if (!(fp = fopen(NEWBIE_EQ, "r"))) {
perror(NEWBIE_EQ);
exit(1);
}
while (get_line(fp, line) && *line != '$')
count++;
rewind(fp);
CREATE(eq_list, struct eq_list_data, count);
while (get_line(fp, line) && *line != '$') {
if (sscanf(line, " %s %d %d %d ", flags, t, t+1, t+2) != 4) {
fprintf(stderr, "SYSERR: Reading newbie eq list.\n");
exit(1);
}
eq_list[i].class_bitv = asciiflag_conv(flags);
eq_list[i].vnum = t[0];
eq_list[i].amt = t[1];
eq_list[i].to = t[2];
i++;
}
fclose(fp);
}
I'll leave the conversion of the actual code to give the newbie the
objects to use the eq_list_data eq_list[] dynamic array as an exercise
for the reader (it's rather simple).
Wow, that's the most Mailer Code(tm) I've posted in a _long_ time...
-dak : I got a haircut today... :)
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST