I have come across an odd bug that I can't figure out. An argument for my
modified skillo() function parses incorrectly for EVERY 3rd SKILL_XXX. My
brain has turned to mush trying to figure this out. If anyone can see
what's going on, any assistance would be most appreciated. :) Here is
the relevant information and further explanation:
The code is p15, 128-bit modified; classes removed. I added 2 arguments to
skillo() and severed it completely from spello(). I duplicated all
relevant spello() subroutines for corresponding skillo() subroutines. The
2 new arguments added to skillo() dictate the number of GET_PRACTICES it
costs to (a) learn a skill for the first time and (b) increase your
knowledge of that skill once you know it. In stock p15 code, it only costs
1 GET_PRACTICE each time someone learns or increases a spell or skill, per
SPECIAL(guild) in spec_procs.c. I wanted to have it cost more to learn a
skill the first time. Having modified all the relevant files, my new
system works. --Except for every 3rd skill defined in spells.h.
For simplicity sake, I set all skills to cost 10 GET_PRACTICES the first
time you practice it and 5 GET_PRACTICES each time thereafter. In
spells.h, my SKILL_XXXs start at 201. Skill #201 (combat arts) subtracts
the appropriate GET_PRACTICES for both initally learning a new spell (10
GET_PRACTICES) and for subsequently practicing it further (5
GET_PRACTICES). However, starting with Skill #202 -- and every 3rd skill
thereafter (205, 208, 211, 214, 217, etc) -- the initial cost of 10
GET_PRACTICES for learning a new skill is appropriately subtracted from the
player's records. BUT... the subsequent cost of increasing knowledge in
those errant skills is only decremented by 1 GET_PRACTICES rather than 5
GET_PRACTICES. I have no idea why. Here are some relevant code snippets
that may unravel the mystery:
In spell_parser.c (and correspondingly in spells.h), these functions were
added:
void skillo(int skl, const char *name, int init_cost, int sub_cost)
{
skill_info[skl].init_cp_cost = init_cost;
skill_info[skl].sub_cp_cost = sub_cost;
skill_info[skl].name = name;
}
void mag_assign_skills(void)
{
int i;
/* MAX_SPELLS is 200 (from 1-200). MAX_SKILLS is 299 (from 201-299) */
for (i = MAX_SPELLS + 1; i <= MAX_SKILLS; i++)
unused_skill(i);
skillo(SKILL_COMBAT_ARTS, "combat arts", 10, 5); /* 201 in spells.h */
skillo(SKILL_SPELLCRAFT, "spellcraft", 10, 5); /* 202 in spells.h */
skillo(SKILL_SWORDS, "swords", 10, 5); /* 203 in spells.h */
skillo(SKILL_POLEARMS, "polearms", 10, 5); /* 204 in spells.h */
skillo(SKILL_DODGING, "dodging", 10, 5); /* 205 in spells.h */
skillo(SKILL_HEALING, "healing", 10, 5); /* 206 in spells.h */
skillo(SKILL_APPRAISING, "appraising", 10, 5); /* 207 in spells.h */
skillo(SKILL_WOODWORKING, "woodworking", 10, 5); /* 208 in spells.h */
[etc.]
skillo(SKILL_HORSE_RIDING, "horse riding", 10, 5); /* 276 in spells.h */
}
In spec_procs.c, SPECIAL(guild) is modified as follows:
SPECIAL(guild)
{
int skill_num;
<snip>
if (GET_SKILL(ch, skill_num) > 0) { /* Has he practiced this yet? */
if (GET_PRACTICES(ch) >= skill_info[skill_num].sub_cp_cost)
GET_PRACTICES(ch) -= skill_info[skill_num].sub_cp_cost;
else {
send_to_char("You do not have enough character points to increase
your skill!\r\n", ch); /* "Character Points" replace "practices" in my MUD */
return (1);
}
}
else { /* It's a new skill to this character! */
if (GET_PRACTICES(ch) >= skill_info[skill_num].init_cp_cost)
GET_PRACTICES(ch) -= skill_info[skill_num].init_cp_cost;
else {
send_to_char("You do not have enough character points to learn a new
skill!\r\n", ch);
return (1);
}
}
/* Now increase the skill by 1 "percent" regardless of intelligence
* I'm actually using "ranks" and not "percentages"
*/
SET_SKILL(ch, skill_num, GET_SKILL(ch, skill_num) + 1);
send_to_char("You practice a while....\r\n", ch);
return (1);
}
As you can see in the spello() calls, "spellcraft" is set to decrement a
player's GET_PRACTICES by 5 if he practices it a 2nd or more times.
However the bug has spellcraft, dodging, woodworking, and every 3rd skill
thereafter only decrementing the player's GET_PRACTICES by 1 if he learns 2
or more ranks in those skills. (The inital cost of 10 GET_PRACTICES oddly
seems to still decrement properly.) Any help is most appreciated! Thanks
in advance.
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST