From: "Mathew Earle Reuther" <graymere@zipcon.net> > sprintf(buf, "\r\n [Runic Languages] -> "); > write_to_output(d, buf); > if (class_ok_by_race[(int)GET_RACE(d->character)][16]) { > sprintf(buf + strlen(buf), "(%s)%s ", classes[16].class_letter, > classes[16].class_name); > write_to_output(d, buf); } > if (class_ok_by_race[(int)GET_RACE(d->character)][17]) { > sprintf(buf + strlen(buf), "(%s)%s ", classes[17].class_letter, > classes[17].class_name); > write_to_output(d, buf); } Quick fix: write_to_output(d, "\r\n [Runic Languages] -> "); if (class_ok_by_race[(int)GET_RACE(d->character)][16]) write_to_output(d, "(%s)%s ", classes[16].class_letter, classes[16].class_name); if (class_ok_by_race[(int)GET_RACE(d->character)][17]) write_to_output(d, "(%s)%s ", classes[17].class_letter, classes[17].class_name); Read more below for ideas to make this code better[1]: First off - to make your code easier to debug, make some macros. These are examples, meant to be stupid, and also only here to get my point across. #define CLASS_MAGIC_STUDIES_ONE 0 #define CLASS_MAGIC_STUDIES_TWO 14 #define CLASS_MAGIC_STUDIES_THREE 19 #define CLASS_RUNIC_LANG_ONE 16 #define CLASS_RUNIC_LANG_TWO 17 etc. if you wish to keep the same struct you already have, use something like this: void list_valid_classes(struct descriptor_data *d) { char buf[MAX_STRING_LENGTH]; int len = 0; struct char_data *ch = d->character; write_to_output(d, "Please Select a Profession:\r\n\r\n"); if (class_ok_by_race[(int)GET_RACE(ch)][CLASS_MAGIC_STUDIES_ONE]) len += snprintf(buf + len, sizeof(buf) - len, "(%s)%s ", classes[CLASS_MAGIC_STUDIES_ONE].class_letter, classes[CLASS_MAGIC_STUDIES_ONE].class_name); if (class_ok_by_race[(int)GET_RACE(ch)][CLASS_MAGIC_STUDIES_TWO]) len += snprintf(buf + len, sizeof(buf) - len, "(%s)%s ", classes[CLASS_MAGIC_STUDIES_TWO].class_letter, classes[CLASS_MAGIC_STUDIES_TWO].class_name); if (class_ok_by_race[(int)GET_RACE(ch)][CLASS_MAGIC_STUDIES_THREE]) len += snprintf(buf + len, sizeof(buf) - len, "(%s)%s ", classes[CLASS_MAGIC_STUDIES_THREE].class_letter, classes[CLASS_MAGIC_STUDIES_THREE].class_name); if (len) { write_to_output(d, "[Magical Studies] -> %s", buf); strcpy(buf, ""); len = 0; } and so on, for the other professions. Or change the 'classes' struct a bit - this _will_ pay off in the long run: Instead of a struct like this: const struct classes_type { char class_letter; const char *class_name; /* more info on the merits of this class */ } classes[] = { { 'g', "animist" /*, more info*/}, { 'h', "elementalist"/*, more info*/} }; and having to keep track of which classes have which number, it might pay off to have a struct more like this: struct classes_sub_type { char class_letter; const char *class_name; int class_number; /* more info on the merits of this class */ struct classes_sub_type *next; } struct classes_type { const char *super_class_name; /* full name of this class base */ struct classes_sub_type *classes_list; /* linked list of classes, info as above */ } Of course this kind of structure would need another kind of initialisation[2], but would allow you to have more compact and easier to debug code; assuming you during initialization have set the int num_classes to the amount of initialized classes_type structs, this would work: void list_valid_classes(struct descriptor_data *d) { int i, len = 0, output = FALSE; struct classes_sub_type c; char buf[MAX_STRING_LENGTH-3]; /* \r\n\0 in write_to_output call */ struct char_data *ch = d->character; for (i = 0;i < num_classes;i++){ /* first, write the profession name at the start of the line */ len = snprintf(buf, sizeof(buf), "[%20s] ->", classes[i].super_class_name); /* now, check the list for available classes */ for (c = classes[i].classes_list;c != NULL;c = c->next) { if (class_ok_by_race[(int)GET_RACE(ch)][c->class_number]) { /* if any, write those too (appended to the current line)*/ len += snprintf(buf + len, sizeof(buf) - len, "(%c)%20s ", c->class_letter, c->class_name); /* and make sure to send it */ output = TRUE; } } if (output) { write_to_output(d, "%s\r\n", buf); /* ok */ output = FALSE; } } } Welcor [1] 'better' in the meaning "easier to read, debug, expand and perhaps faster too" [2] for instance, an external file: Magic studies #1 a Illusions #2 b Summons #3 e Necromancy ### Natural Theology #14 g Animist #17 h Elementalist ### etc. -- +---------------------------------------------------------------+ | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html | | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html | | Newbie List: http://groups.yahoo.com/group/circle-newbies/ | +---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 06/25/03 PDT