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