Well so far I have made progress in this using the prereq like college courses. However, I've run into a problem where it doesn't seem to be doing it correctly, thus far I have this: A new class called Adventurer Added this into the spell structure in spells.h: int prereq[3]; // 2 skills, then a min level Added in the command learn in act.other.c: ACMD(do_learn) { if (IS_NPC(ch)) return; if (!IS_ADVENTURER(ch)) { perform_huh(ch); return; } one_argument(argument, arg); if (*arg) send_to_char("You can only learn skills at a teacher.\r\n", ch); else list_learnable(ch); } Added in a function in class.c: void init_adven_spells(void) { adven_decla(SKILL_KICK, -1, -1, 1); adven_decla(SKILL_BASH, SKILL_KICK, -1, 2); } Added in this to spell_parser.c: void adven_decla(int spell, int pre1, int pre2, int level) { int bad = 0; if (spell < 0 || spell > TOP_SPELL_DEFINE) { log("SYSERR: attempting assign to illegal spellnum %d/%d", spell, TOP_SPELL_DEFINE); return; } if (level < 1 || level > LVL_IMPL) { log("SYSERR: assigning '%s' to illegal level %d/%d.", skill_name(spell), level, LVL_IMPL); bad = 1; } if (!bad) { spell_info[spell].prereq[0] = pre1; spell_info[spell].prereq[1] = pre2; spell_info[spell].prereq[2] = level; } } And in spello threw this in: for (i = 0; i < 3; i++) spell_info[spl].prereq[i] = -2; In spec_procs.c I added this function, check_level(struct char_data *ch, int skill) checks to see if a player knows/can use that spell or skill, returns true if they can, false if they cant: void list_learnable(struct char_data * ch) { int i; sprintf(buf, "You could learn the following:\r\n"); for (i = 1; i <= MAX_SKILLS; i++) { if (strlen(buf) >= MAX_STRING_LENGTH - 32) { strcat(buf, "**OVERFLOW**\r\n"); break; } if (spell_info[i].prereq[0] > 0) if (!check_level(ch, spell_info[i].prereq[0])) continue; if (spell_info[i].prereq[1] > 0) if (!check_level(ch, spell_info[i].prereq[1])) continue; if (spell_info[i].prereq[2] > 0) if (GET_LEVEL(ch) < spell_info[i].prereq[2]) continue; if (check_level(ch, i)) continue; if (strcmp(spell_info[i].name, "!UNUSED!")) { sprintf(buf2, "%-20s\r\n", spell_info[i].name); strcat(buf, buf2); } } page_string(ch->desc, buf, 1); } In db.c this is what I have for bootup: log("Assigning spell and skill levels."); init_spell_levels(); init_adven_spells(); The problem is, typing learn either lists all the skills for a new adventurer (it should only list kick, [not bash since bash needs kick]), or in the case of an IMP who has skillsetted kick and bash to 0, it lists nothing. [5000/5000 5000/5000 5000/5000][] > You change Dust's kick to 0. [5000/5000 5000/5000 5000/5000][] > You could learn the following: i'm pretty sure its something stupid, I just hope it isn't too stupid... I tried to use an array to contain the prerequired skills and the level but that didn't seem to work out very well. Thanks for any input! _________________________________________________________________ Get your FREE download of MSN Explorer at http://explorer.msn.com -- +---------------------------------------------------------------+ | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html | | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html | +---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/05/01 PST