That's quite a list of changes you want there. Some are quite easy,
others will take a lot of coding to get in. I'll give you some ideas...
----- Original Message -----
From: Nick Shaw
> I was wondering if someone could help me by pointing out whats files i
> should change or even what i should do if i wanted to make all the player
> skills available to any class (not spells though). Ive been fiddling
> around but havent managed to do it. e.g. a warrior could go to a thief
> teacher and learn thief skills etc.
Change the init_spell_levels call to initialise skills for all classes;
for (i = 0;i<NUM_CLASSES;i++) {
spell_level(SKILL_SNEAK, i, 1);
...
}
> and how can i set it up that the
> thief teacher will only teach and list thief skills, warrior warrior
> skills and so on.
You'll need to change the spell_info_type() structure in spells.h, so
it includes a class bitvector, and properly initialise it in
spell_parser.c by changing the spello calls;
in spells.h:
int allowed_classes; /* classes allowed to learn this */
change spello to:
void spello(int spl, const char *name, int max_mana, int min_mana,
int mana_change, int minpos, int targets, int violent, int routines,
const char *wearoff, int classes)
{
int i;
for (i = 0; i < NUM_CLASSES; i++)
spell_info[spl].min_level[i] = LVL_IMMORT;
spell_info[spl].mana_max = max_mana;
spell_info[spl].mana_min = min_mana;
spell_info[spl].mana_change = mana_change;
spell_info[spl].min_position = minpos;
spell_info[spl].targets = targets;
spell_info[spl].violent = violent;
spell_info[spl].routines = routines;
spell_info[spl].name = name;
spell_info[spl].wear_off_msg = wearoff;
spell_info[spl].allowed_classes = classes;
}
(Fix unused_spell() too)
Change skillo() to this definition instead:
#define skillo(skill, name) spello(skill, name, 0, 0, 0, 0, 0, 0, 0, NULL, \
(1<<CLASS_MAGIC_USER) | (1<<CLASS_CLERIC) | (1<<CLASS_WARRIOR) |
(1<<CLASS_THIEF));
Then change all of your spello calls like this example:
spello(SPELL_ANIMATE_DEAD, "animate dead", 35, 10, 3, POS_STANDING,
TAR_OBJ_ROOM, FALSE, MAG_SUMMONS,
NULL, (1<<CLASS_MAGIC_USER) | (1<<CLASS_CLERIC) );
Of course only add the classes you wish to be able to learn the spell.
Having initialised the spell_info[] array, your next task will be
to change the guild spec proc in spec_procs.c
Make an array for guildmasters:
struct guild_master_type {
mob_vnum my_vnum; /* vnum of guildmaster */
int classes_taught; /* which classes will he teach */
} guild_masters = {
{3020, (1<<CLASS_MAGIC_USER)},
{3021, (1<<CLASS_CLERIC)},
...
{-1, 0}
}
Change
list_skills(struct char_data *ch)
to
list_skills(struct char_data *ch, struct char_data *gm)
and add a check like this:
int i, classes_taught = -1;
if (gm) {
for (i=0;guild_masters[i]!=-1;i++) {
if (GET_MOB_VNUM(gm) == guild_masters[i].my_vnum)
classes_taught = guild_masters[i].classes_taught;
}
}
for (sortpos = 1; sortpos <= MAX_SKILLS; sortpos++) {
i = spell_sort_info[sortpos];
if (strlen(buf2) >= MAX_STRING_LENGTH - 32) {
strcat(buf2, "**OVERFLOW**\r\n");
break;
}
if (GET_LEVEL(ch) >= spell_info[i].min_level[(int) GET_CLASS(ch)] &&
((classes_taught == -1) || /* all classes taught here / no gm */
((1<<GET_CLASS(ch)) & spell_info[i].classes_allowed)) {
sprintf(buf, "%-20s %s\r\n", spell_info[i].name,
how_good(GET_SKILL(ch, i)));
strcat(buf2, buf); /* The above, ^ should always be safe to do. */
}
}
Now list_skills will only list skill taught to the class specified in
the struct above.
Finally, in SPECIAL(guild)
make sure list_skills is called as list_skills(ch, (struct char_data *)me);
and in do_practice, it should be called as list_skills(ch, NULL)
add a final check:
if (!((1<<GET_CLASS(ch)) & spell_info[skill_num].allowed_classes) {
sprintf(buf, "You do not know of that %s.\r\n", SPLSKL(ch));
send_to_char(buf, ch);
return (1);
}
> Also how do i get it to only list the skills you
> have learnt when you type practice rather than all the skills available
> to you.
in the above (list_skills) make a check for whether you're at a gm
and list all in that case, or are typing 'prac' and then only list
those with GET_SKILL(ch, skill_num);
if (GET_LEVEL(ch) >= spell_info[i].min_level[(int) GET_CLASS(ch)] &&
((classes_taught == -1) || /* all classes taught here / no gm */
((1<<GET_CLASS(ch)) & spell_info[i].classes_allowed)) {
becomes:
if (GET_LEVEL(ch) >= spell_info[i].min_level[(int) GET_CLASS(ch)] &&
((classes_taught == -1) || /* all classes taught here / no gm */
((1<<GET_CLASS(ch)) & spell_info[i].classes_allowed) &&
((gm) || GET_SKILL(ch, i))) {
> It seems a bit silly to me that you have it on your list if you
> havent learned it. And one last thing (since ive been asking so much),
> how can i make it so that the magicuser class can practice both spells
> and skills, not just one or the other.
That's primarily a cosmetic issue. I'll leave it as an excercise :P
Mind you, the above is VERY much mailer code (and if you have trouble
understanding what it does, tinker with it :)
Welcor
--
Paranoid schizophrenics outnumber their enemies at least two to one.
--
+---------------------------------------------------------------+
| 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