skylib_mudos_v1/
skylib_mudos_v1/bin/
skylib_mudos_v1/bin/db/
skylib_mudos_v1/mudlib/banish/a/
skylib_mudos_v1/mudlib/banish/b/
skylib_mudos_v1/mudlib/banish/c/
skylib_mudos_v1/mudlib/banish/d/
skylib_mudos_v1/mudlib/banish/e/
skylib_mudos_v1/mudlib/banish/f/
skylib_mudos_v1/mudlib/banish/g/
skylib_mudos_v1/mudlib/banish/h/
skylib_mudos_v1/mudlib/banish/j/
skylib_mudos_v1/mudlib/banish/l/
skylib_mudos_v1/mudlib/banish/m/
skylib_mudos_v1/mudlib/banish/n/
skylib_mudos_v1/mudlib/banish/o/
skylib_mudos_v1/mudlib/banish/p/
skylib_mudos_v1/mudlib/banish/r/
skylib_mudos_v1/mudlib/banish/s/
skylib_mudos_v1/mudlib/banish/t/
skylib_mudos_v1/mudlib/banish/u/
skylib_mudos_v1/mudlib/banish/w/
skylib_mudos_v1/mudlib/cmds/
skylib_mudos_v1/mudlib/cmds/admin/
skylib_mudos_v1/mudlib/cmds/guild-race/
skylib_mudos_v1/mudlib/cmds/guild-race/crafts/
skylib_mudos_v1/mudlib/cmds/guild-race/magic/
skylib_mudos_v1/mudlib/cmds/guild-race/other/
skylib_mudos_v1/mudlib/cmds/living/broken/
skylib_mudos_v1/mudlib/cmds/player/group_cmds/
skylib_mudos_v1/mudlib/d/admin/
skylib_mudos_v1/mudlib/d/admin/room/
skylib_mudos_v1/mudlib/d/admin/room/we_care/
skylib_mudos_v1/mudlib/d/admin/save/
skylib_mudos_v1/mudlib/d/admin/text/
skylib_mudos_v1/mudlib/d/learning/TinyTown/buildings/
skylib_mudos_v1/mudlib/d/learning/TinyTown/map/
skylib_mudos_v1/mudlib/d/learning/TinyTown/roads/
skylib_mudos_v1/mudlib/d/learning/chars/
skylib_mudos_v1/mudlib/d/learning/functions/
skylib_mudos_v1/mudlib/d/learning/handlers/
skylib_mudos_v1/mudlib/d/learning/help_topics/
skylib_mudos_v1/mudlib/d/learning/help_topics/npcs/
skylib_mudos_v1/mudlib/d/learning/help_topics/objects/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/crowd/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/situations/
skylib_mudos_v1/mudlib/d/learning/save/
skylib_mudos_v1/mudlib/d/learning/school/
skylib_mudos_v1/mudlib/d/learning/school/add_sc/
skylib_mudos_v1/mudlib/d/learning/school/characters/
skylib_mudos_v1/mudlib/d/learning/school/general/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/basic_commands/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/edtutor/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_mudos_v1/mudlib/d/learning/school/items/
skylib_mudos_v1/mudlib/d/learning/school/npc_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/room_basic/
skylib_mudos_v1/mudlib/d/learning/school/room_school/situations/
skylib_mudos_v1/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_mudos_v1/mudlib/d/learning/text/
skylib_mudos_v1/mudlib/d/liaison/
skylib_mudos_v1/mudlib/d/mudlib/
skylib_mudos_v1/mudlib/d/mudlib/changes/
skylib_mudos_v1/mudlib/d/playtesters/
skylib_mudos_v1/mudlib/d/playtesters/effects/
skylib_mudos_v1/mudlib/d/playtesters/handlers/
skylib_mudos_v1/mudlib/d/playtesters/items/
skylib_mudos_v1/mudlib/d/sage/
skylib_mudos_v1/mudlib/doc/
skylib_mudos_v1/mudlib/doc/creator/
skylib_mudos_v1/mudlib/doc/driver/
skylib_mudos_v1/mudlib/doc/driver/efuns/arrays/
skylib_mudos_v1/mudlib/doc/driver/efuns/buffers/
skylib_mudos_v1/mudlib/doc/driver/efuns/compile/
skylib_mudos_v1/mudlib/doc/driver/efuns/filesystem/
skylib_mudos_v1/mudlib/doc/driver/efuns/floats/
skylib_mudos_v1/mudlib/doc/driver/efuns/functions/
skylib_mudos_v1/mudlib/doc/driver/efuns/general/
skylib_mudos_v1/mudlib/doc/driver/efuns/mappings/
skylib_mudos_v1/mudlib/doc/driver/efuns/mixed/
skylib_mudos_v1/mudlib/doc/driver/efuns/mudlib/
skylib_mudos_v1/mudlib/doc/driver/efuns/numbers/
skylib_mudos_v1/mudlib/doc/driver/efuns/parsing/
skylib_mudos_v1/mudlib/doc/known_command/
skylib_mudos_v1/mudlib/doc/login/
skylib_mudos_v1/mudlib/doc/lpc/basic_manual/
skylib_mudos_v1/mudlib/doc/lpc/intermediate/
skylib_mudos_v1/mudlib/doc/new/add_command/
skylib_mudos_v1/mudlib/doc/new/events/
skylib_mudos_v1/mudlib/doc/new/handlers/
skylib_mudos_v1/mudlib/doc/new/living/race/
skylib_mudos_v1/mudlib/doc/new/living/spells/
skylib_mudos_v1/mudlib/doc/new/object/
skylib_mudos_v1/mudlib/doc/new/player/
skylib_mudos_v1/mudlib/doc/new/room/guild/
skylib_mudos_v1/mudlib/doc/new/room/outside/
skylib_mudos_v1/mudlib/doc/new/room/storeroom/
skylib_mudos_v1/mudlib/doc/object/
skylib_mudos_v1/mudlib/doc/playtesters/
skylib_mudos_v1/mudlib/doc/policy/
skylib_mudos_v1/mudlib/doc/weapons/
skylib_mudos_v1/mudlib/global/
skylib_mudos_v1/mudlib/global/creator/
skylib_mudos_v1/mudlib/global/handlers/
skylib_mudos_v1/mudlib/global/virtual/setup_compiler/
skylib_mudos_v1/mudlib/include/cmds/
skylib_mudos_v1/mudlib/include/effects/
skylib_mudos_v1/mudlib/include/npc/
skylib_mudos_v1/mudlib/include/room/
skylib_mudos_v1/mudlib/include/shops/
skylib_mudos_v1/mudlib/net/daemon/
skylib_mudos_v1/mudlib/net/daemon/chars/
skylib_mudos_v1/mudlib/net/inherit/
skylib_mudos_v1/mudlib/net/obj/
skylib_mudos_v1/mudlib/obj/amulets/
skylib_mudos_v1/mudlib/obj/b_day/
skylib_mudos_v1/mudlib/obj/clothes/
skylib_mudos_v1/mudlib/obj/dwarmours/plate/
skylib_mudos_v1/mudlib/obj/dwclothes/transport/horse/
skylib_mudos_v1/mudlib/obj/dwscabbards/
skylib_mudos_v1/mudlib/obj/dwweapons/axes/
skylib_mudos_v1/mudlib/obj/dwweapons/chains/
skylib_mudos_v1/mudlib/obj/faith/symbols/
skylib_mudos_v1/mudlib/obj/fungi/
skylib_mudos_v1/mudlib/obj/gatherables/
skylib_mudos_v1/mudlib/obj/instruments/
skylib_mudos_v1/mudlib/obj/magic/
skylib_mudos_v1/mudlib/obj/media/
skylib_mudos_v1/mudlib/obj/misc/player_shop/
skylib_mudos_v1/mudlib/obj/monster/godmother/
skylib_mudos_v1/mudlib/obj/monster/transport/
skylib_mudos_v1/mudlib/obj/rings/
skylib_mudos_v1/mudlib/obj/spells/
skylib_mudos_v1/mudlib/obj/stationery/
skylib_mudos_v1/mudlib/obj/stationery/envelopes/
skylib_mudos_v1/mudlib/obj/stationery/papers/
skylib_mudos_v1/mudlib/obj/toys/
skylib_mudos_v1/mudlib/obj/vessels/
skylib_mudos_v1/mudlib/obj/weapons/swords/
skylib_mudos_v1/mudlib/save/autodoc/
skylib_mudos_v1/mudlib/save/leaflets/
skylib_mudos_v1/mudlib/save/mail/
skylib_mudos_v1/mudlib/save/new_soul/data/
skylib_mudos_v1/mudlib/save/parcels/
skylib_mudos_v1/mudlib/save/playerinfo/
skylib_mudos_v1/mudlib/save/players/d/
skylib_mudos_v1/mudlib/save/random_names/
skylib_mudos_v1/mudlib/save/random_names/data/
skylib_mudos_v1/mudlib/save/terrains/
skylib_mudos_v1/mudlib/save/terrains/tutorial_desert/
skylib_mudos_v1/mudlib/save/terrains/tutorial_grassy_field/
skylib_mudos_v1/mudlib/save/terrains/tutorial_mountain/
skylib_mudos_v1/mudlib/save/todo_lists/
skylib_mudos_v1/mudlib/secure/
skylib_mudos_v1/mudlib/secure/cmds/admin/
skylib_mudos_v1/mudlib/secure/cmds/lord/
skylib_mudos_v1/mudlib/secure/config/
skylib_mudos_v1/mudlib/secure/handlers/autodoc/
skylib_mudos_v1/mudlib/secure/handlers/intermud/
skylib_mudos_v1/mudlib/secure/include/global/
skylib_mudos_v1/mudlib/secure/save/
skylib_mudos_v1/mudlib/secure/save/handlers/
skylib_mudos_v1/mudlib/secure/std/classes/
skylib_mudos_v1/mudlib/secure/std/modules/
skylib_mudos_v1/mudlib/std/commands/
skylib_mudos_v1/mudlib/std/commands/shadows/
skylib_mudos_v1/mudlib/std/creator/
skylib_mudos_v1/mudlib/std/dom/
skylib_mudos_v1/mudlib/std/effects/
skylib_mudos_v1/mudlib/std/effects/external/
skylib_mudos_v1/mudlib/std/effects/fighting/
skylib_mudos_v1/mudlib/std/effects/priest/
skylib_mudos_v1/mudlib/std/effects/room/
skylib_mudos_v1/mudlib/std/environ/
skylib_mudos_v1/mudlib/std/guilds/
skylib_mudos_v1/mudlib/std/guilds/old/
skylib_mudos_v1/mudlib/std/languages/
skylib_mudos_v1/mudlib/std/languages/BACKUPS/
skylib_mudos_v1/mudlib/std/liquids/
skylib_mudos_v1/mudlib/std/npc/
skylib_mudos_v1/mudlib/std/npc/goals/
skylib_mudos_v1/mudlib/std/npc/goals/basic/
skylib_mudos_v1/mudlib/std/npc/goals/misc/
skylib_mudos_v1/mudlib/std/npc/plans/
skylib_mudos_v1/mudlib/std/npc/plans/basic/
skylib_mudos_v1/mudlib/std/npc/types/
skylib_mudos_v1/mudlib/std/npc/types/helper/
skylib_mudos_v1/mudlib/std/npcs/
skylib_mudos_v1/mudlib/std/outsides/
skylib_mudos_v1/mudlib/std/races/shadows/
skylib_mudos_v1/mudlib/std/room/basic/topography/
skylib_mudos_v1/mudlib/std/room/controller/
skylib_mudos_v1/mudlib/std/room/inherit/topography/
skylib_mudos_v1/mudlib/std/room/topography/area/
skylib_mudos_v1/mudlib/std/room/topography/iroom/
skylib_mudos_v1/mudlib/std/room/topography/milestone/
skylib_mudos_v1/mudlib/std/shadows/curses/
skylib_mudos_v1/mudlib/std/shadows/disease/
skylib_mudos_v1/mudlib/std/shadows/fighting/
skylib_mudos_v1/mudlib/std/shadows/healing/
skylib_mudos_v1/mudlib/std/shadows/magic/
skylib_mudos_v1/mudlib/std/shadows/poison/
skylib_mudos_v1/mudlib/std/shadows/rituals/
skylib_mudos_v1/mudlib/std/shadows/room/
skylib_mudos_v1/mudlib/std/shops/controllers/
skylib_mudos_v1/mudlib/std/shops/objs/
skylib_mudos_v1/mudlib/std/shops/player_shop/
skylib_mudos_v1/mudlib/std/socket/
skylib_mudos_v1/mudlib/std/soul/
skylib_mudos_v1/mudlib/std/soul/d/
skylib_mudos_v1/mudlib/std/soul/e/
skylib_mudos_v1/mudlib/std/soul/i/
skylib_mudos_v1/mudlib/std/soul/j/
skylib_mudos_v1/mudlib/std/soul/k/
skylib_mudos_v1/mudlib/std/soul/l/
skylib_mudos_v1/mudlib/std/soul/n/
skylib_mudos_v1/mudlib/std/soul/o/
skylib_mudos_v1/mudlib/std/soul/q/
skylib_mudos_v1/mudlib/std/soul/u/
skylib_mudos_v1/mudlib/std/soul/v/
skylib_mudos_v1/mudlib/std/soul/y/
skylib_mudos_v1/mudlib/std/soul/z/
skylib_mudos_v1/mudlib/std/stationery/
skylib_mudos_v1/mudlib/w/
skylib_mudos_v1/mudlib/w/default/
skylib_mudos_v1/mudlib/w/default/armour/
skylib_mudos_v1/mudlib/w/default/clothes/
skylib_mudos_v1/mudlib/w/default/item/
skylib_mudos_v1/mudlib/w/default/npc/
skylib_mudos_v1/mudlib/w/default/room/
skylib_mudos_v1/mudlib/w/default/weapon/
skylib_mudos_v1/mudlib/www/
skylib_mudos_v1/mudlib/www/download/
skylib_mudos_v1/mudlib/www/java/
skylib_mudos_v1/mudlib/www/secure/
skylib_mudos_v1/mudlib/www/secure/lpc/advanced/
skylib_mudos_v1/mudlib/www/secure/lpc/intermediate/
skylib_mudos_v1/v22.2b14-DSv10/
skylib_mudos_v1/v22.2b14-DSv10/ChangeLog.old/
skylib_mudos_v1/v22.2b14-DSv10/Win32/
skylib_mudos_v1/v22.2b14-DSv10/compat/
skylib_mudos_v1/v22.2b14-DSv10/compat/simuls/
skylib_mudos_v1/v22.2b14-DSv10/include/
skylib_mudos_v1/v22.2b14-DSv10/mudlib/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/clone/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/command/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/data/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/etc/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/include/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/master/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/log/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/compiler/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/efuns/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/operators/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/u/
skylib_mudos_v1/v22.2b14-DSv10/tmp/
skylib_mudos_v1/v22.2b14-DSv10/windows/
/**
 * This is the training hall inherit.
 * @author Shaydz
 */

#include <skills.h>
#include <tune.h>
#include <config.h>

private int cost_div;
private int cost_mult;
private string teaching_skill;
private object teaching_person;

int do_cost_to( string skill, int level );
int do_cost_by( string skill, int level );
int do_cost( string skill );

int do_advance( string skill );
int do_advance_to( string skill, int num );
int do_advance_by( string skill, int num );

/** @ignore yes */
void create() {
   TO->add_help_file("training_hall");
   cost_div = COST_DIV;
   cost_mult = 100;
} /* create() */

/** @ignore yes */
void init() {
    add_command("advance", "<string>", (: do_advance($4[0]) :) );
    add_command("advance", "<string> to <number>",
        (: do_advance_to( $4[0], $4[1] ) :) );
    add_command("advance", "<string> by <number>",
        (: do_advance_by( $4[0], $4[1] ) :) );
    add_command("cost", "<string>", (: do_cost($4[0]) :) );
    add_command("cost", "<string> to <number>",
        (: do_cost_to($4[0], $4[1]) :) );
    add_command("cost", "<string> by <number>",
        (: do_cost_by($4[0], $4[1]) :) );
} /* init() */

/**
 * @ignore yes
 * Points of interest:
 *   cost_div -> zero      gives cost_mult = 10
 *   cost_div = COST_DIV   gives cost_mult = 100
 *   cost_div -> infinity  gives cost_mult = 1000
 */
void set_cost_div( int number ) {
   cost_div = number;

   /* stands in for infinity */
   if( !cost_div )
       cost_mult = 1000;
   else
       cost_mult = 10 + ( 990 * cost_div ) / ( 10 * COST_DIV + cost_div );

} /* set_cost_div() */

/** @ignore yes */
int query_skill_cost( string skill, int offset ) {
    float base, total;
    string *next;

    next = (string *)SKILL_OB->query_immediate_children( skill );
    if( !sizeof( next ) ) {
        base = (float)STD_GUILD_OBJ->query_skill_cost( skill, TP );
        total = base;
        total *= ( STD_COST * cost_mult ) / 500;
        total *= ( (int)TP->query_skill( skill ) + offset ) / LEVEL_DIV + 1;
        total += 30 * base;
        // this is the new, increased skill cost.
        return to_int( total * exp( ( TP->query_skill( skill ) +
                       offset ) / 150.0 ) );
    }

    foreach( skill in next )
        total += query_skill_cost( skill, offset );

    return total;

} /* query_skill_cost() */

/** @ignore yes */
int do_advance_internal( string skill, int to, int by ) {
   string *bits;
   string skill_name;
   string outer_name;
   string place;
   int lvl;
   int max_lvl;
   int tmp;
   int total_xp;
   int p_val;
   int i;

   place = TO->query_property( "place" );
   if(!place)  place = "default";
   bits = explode( implode( explode( skill, " " ), "." ), "." );

   if(strlen(bits[0])==2){
      if( bits[0][0..1]!=teaching_skill[0..1] ) {
          add_failed_mess( "You cannot advance "+skill+" here!\n" );
          return 0;
      }
   }else{
      if( (bits[0]!=teaching_skill) ) {
          add_failed_mess( "You cannot advance "+skill+" here!\n" );
          return 0;
      }
   }
   if( !( skill_name = (string)SKILL_OB->query_skill( bits ) ) ) {
      add_failed_mess( "The skill "+ skill +" does not exist.\n" );
      return 0;
   }
   lvl = (int)TP->query_skill( skill_name );
   if( !by && to )
      by = to - lvl;
   if( by <= 0 ) {
      if ( by == 0 )
         add_failed_mess( "You are already at level "+ lvl +" at "+
                          skill_name +".\n" );
      else
         add_failed_mess( "You cannot regress below your current "
                          "skill level!\n" );
      return 0;
   }
   if( SKILL_OB->query_only_leaf(skill_name) ) {
       if( sizeof( (mixed)SKILL_OB->query_immediate_children(skill_name) ) ) {
           add_failed_mess("You can only advance the outer skills "
                           "(eg: general.riding.horse), "
                           "not the internal "
                           "skills (eg: general.riding, or general).\n");
           return 0;
       }
   } else {
      bits = explode( skill_name, "." );
      if ( sizeof( bits ) > 1 ) {
         outer_name = implode( bits[ 0 .. sizeof( bits ) - 2 ], "." );
         if ( ( ( sizeof( bits ) - 1 ) * 5 ) >
              (int)TP->query_skill( outer_name ) ) {
            add_failed_mess( "You are not at a high enough level in " +
                             outer_name +
                             " to advance "+ skill_name +" yet.\n");
            return 0;
         }
      }
   }

   if (!SKILL_OB->query_allowed_to_teach(skill_name)) {
      add_failed_mess("You cannot learn '"+skill_name+"' from here.\n");
      return 0;
   }

   max_lvl = (int)STD_GUILD_OBJ->query_skill_max_level( skill_name,TP );
   if ( lvl >= max_lvl ) {
      add_failed_mess( "You cannot advance in "+skill_name+" any further here.\n");
      return 0;
   }
   p_val = (int)TP->query_value_in( place );
   if ( place != "default" ) {
      p_val += (int)TP->query_value_in( "default" );
   }
   for ( i = 0; i < by; i++ ) {
      tmp = query_skill_cost( skill_name, i );

      if ( (int)TP->query_xp() < tmp + total_xp ) {
         if ( !i ) {
            add_failed_mess( "Your lack of experience prevents you improving "+
                             skill_name +".\n" );
            return 0;
         } else {
            write( "Your lack of experience prevents you taking all the "
              "advancement you requested in "+ skill_name +".  You are "
              "only trained up to level "+ ( i + lvl ) +".\n" );
         }
         break;
      }
      if ( ( lvl + i ) >= max_lvl ) {
         write( "This training hall hasn't the resources to train you as far as "+
           "you requested in "+ skill_name +".  It trains you to level "+
           max_lvl +".\n" );
         break;
      }
   total_xp += tmp;
   }

   if (!total_xp) {
      return notify_fail("OOpps, something has gone wrong.\n");
   }

   TP->adjust_xp( -total_xp );
   TP->add_skill_level( skill_name, i, total_xp );
   TP->dest_hide_shadow();

   event( TO, "guild_advance", bits, lvl, lvl+i );

   write("You advance your skill in "+ skill_name +" from "+ lvl +" to "+
         ( lvl + i )+" for "+total_xp+" xp.\n");
   say( (string)TP->one_short() +" $V$0=advances,advance$V$ "+
        "$V$0=" + TP->query_possessive() + ",their$V$ skills.\n");
   return 1;

} /* do_advance_internal() */

/** @ignore yes */
int do_advance( string skill ) {
   return do_advance_internal( skill, 0, 1 );
} /* do_advance() */

/** @ignore yes */
int do_advance_by( string skill, int num ) {
   return do_advance_internal( skill, 0, num );
} /* do_advance_by() */

/** @ignore yes */
int do_advance_to( string skill, int num ) {
   return do_advance_internal( skill, num, 0 );
} /* do_advance_to() */

/** @ignore yes */
int check_primaries( string lpath, string g_o ) {
   int i;
   string dummy, *primaries;

   primaries = (string *)g_o->query_skills();
   if ( member_array( lpath, primaries ) != -1 )
      return 1;
   for ( i = 0; i < sizeof( primaries ); i++ )
      if ( sscanf( primaries[ i ], lpath +".%s", dummy ) )
         return 1;
   return 0;
} /* check_primaries() */

/** @ignore yes */
string rec_cost( mixed arr, string path, int depth, string g_o,
                 int primaries, int only_leaf, int brief ) {
  int i, depth_gap, ndots, o_l, tmp, lvl, max_lvl;
  string str, lpath;

  str = "";
  depth_gap = (depth - 1) * 2;
  ndots = 19 - depth_gap;

  for( i = 0; i < sizeof(arr); i += SKILL_ARR_SIZE ) {
      lpath = path + arr[i];
      lvl = (int)TP->query_skill(lpath);
      max_lvl = ( !g_o ? 5 : (int)g_o->query_skill_max_level( lpath,TP ) );
      o_l = only_leaf;
      if( depth == 1 || primaries )
          o_l = SKILL_OB->query_only_leaf( lpath );
      if( lvl >= max_lvl ) {
          if ( (!primaries || check_primaries( lpath, g_o ) ) && !brief ) {
              str += sprintf( "%*'| 's%-*'.'s%4d/%3d  mastered\n", depth_gap,
                     "", ndots, arr[ i ], lvl, max_lvl );
          }
      } else {
          if( (!primaries && (!o_l || !sizeof(arr[ i + SKILL_BIT]) ) ) ||
              check_primaries( lpath, g_o ) ) {
              if( ( o_l && sizeof(arr[i + SKILL_BIT]) ) ||
                  !SKILL_OB->query_allowed_to_teach(lpath) ) {
                  str += sprintf( "%*'| 's%-*'.'s\n", depth_gap, "",
                                  ndots+18, arr[ i ] );
              } else {
                  tmp = query_skill_cost( lpath, 0 );
                  str += sprintf( "%*'| 's%-*'.'s%4d/%3d %6d xp\n", depth_gap,
                                  "", ndots, arr[ i ], lvl, max_lvl, tmp);
              }
          } else if( !primaries && o_l ) {
              str += sprintf( "%*'| 's%-*'.'s\n", depth_gap, "",
                              ndots+18, arr[ i ] );
          }
      }
      if( ( lvl >= depth * 5 ) || primaries || o_l ) {
          reset_eval_cost();
          str += rec_cost( arr[ i + SKILL_BIT ], lpath +".", depth + 1, g_o,
                           primaries, o_l, brief );
      }
  }
  return str;
} /* rec_cost() */

/** @ignore yes */
int do_cost_internal( string skill, int to, int by ) {
   string *bits;
   string skill_name;
   string outer_name;
   int lvl;
   int max_lvl;
   int i;
   int tmp;

   bits = explode( implode( explode( skill, " " ), "." ), "." );

   if( strlen(bits[0]) == 2 ){
       if( bits[0][0..1] != teaching_skill[0..1] ) {
           add_failed_mess("You cannot advance "+skill+" here, so we can't "
	                  "tell you how much it would cost!\n");
           return 0;
      }
   }else{
      if( (bits[0]!=teaching_skill) ) {
          add_failed_mess( "You cannot advance "+skill+" here!\n" );
          return 0;
      }
   }

   if ( !( skill_name = (string)SKILL_OB->query_skill( bits ) ) ) {
      add_failed_mess( "There is no such skill as " + skill + ".\n" );
      return 0;
   }
   lvl = (int)TP->query_skill( skill_name );
   if ( !by && to )
      by = to - lvl;
   if ( by == 0 ) {
      add_failed_mess("It won't cost you anything to stay at the same level!\n");
      return 0;
   }
   if ( by < 0 ) {
      add_failed_mess("We can't give refund xp for regressing skills!\n");
      return 0;
   }
   bits = explode( skill_name, "." );
   if ( sizeof( bits ) > 1 ) {
      if (SKILL_OB->query_only_leaf(skill_name)) {
         if (sizeof((mixed)SKILL_OB->query_immediate_children(skill_name))) {
            notify_fail("You can only advance the outer skills (eg: "
                        "general.riding.horse), not the internal skills "
                        "(eg: general.riding, or general).\n");
            return 0;
         }
      } else {
         outer_name = implode( bits[ 0 .. sizeof( bits ) - 2 ], "." );
         if ( ( ( sizeof( bits ) - 1 ) * 5 ) >
              (int)TP->query_skill( outer_name ) ) {
             notify_fail( "You are not at a high enough level in "+ outer_name +
                          " to advance "+ skill_name +" yet.\n");
             return 0;
         }
      }
   }

   if (!SKILL_OB->query_allowed_to_teach(skill_name)) {
      notify_fail("You cannot learn '"+skill_name+"' from here.\n");
      return 0;
   }

   max_lvl = (int)STD_GUILD_OBJ->query_skill_max_level( skill_name,TP );
   if ( lvl >= max_lvl ) {
      notify_fail( "Our teachers prevent you even considering advancing "+
                   skill_name +" above level "+ max_lvl +".\n" );
      return 0;
   }
   for ( i = 0;i < by; i++ ) {
      if ( ( lvl + i ) >= max_lvl ) {
         write( "Our teachers prevent you considering all the advancement you "+
                "requested.  You can only advance up to level "+ max_lvl +" in "+
                skill_name +" here.\n");
         break;
      }
      tmp += query_skill_cost( skill_name, i );

   }
   printf( "It would cost you %d xp to raise %s from level %d to %d.\n",
           tmp, skill_name, lvl, ( lvl + i ) );
   return 1;
} /* do_cost_internal() */

/** @ignore yes */
int do_cost( string skill ) {
   string *bits;
   mixed arr;
   int i;
   string list;

   bits = explode( implode( explode( skill, " " ), "." ), "." );
   if(strlen(bits[0])==2){
      if( bits[0][0..1]!=teaching_skill[0..1] ) {
          add_failed_mess( "You cannot advance "+skill+" here!\n" );
          return 0;
      }
   } else {
      if( (bits[0]!=teaching_skill) ) {
          add_failed_mess( "You cannot advance "+skill+" here!\n" );
          return 0;
      }
   }
   arr = (mixed)SKILL_OB->query_skills();
   if ( !arr ) {
      notify_fail( "Hmmm, we appear to have an error here.\n" );
      return 0;
   }
   i = member_array( skill, arr );
   if ( i != -1 ) {
      list = sprintf( "%-*'='s\n", (int)TP->query_cols()-1,
            "======SKILLS=======Cur/Max==For Next" );
      list += sprintf( "%#*-s\n", (int)TP->query_cols(),
            rec_cost( arr[ i + 3 ], skill +".", 2, STD_GUILD_OBJ, 0, 0, 0 ) );
      list += sprintf( "%*'='|s\n", (int)TP->query_cols()-1,
            "> You have "+ (int)TP->query_xp() +
            " points to spend. <" );
      TP->more_string( list, capitalize( skill ), 1 );
      return 1;
   }

   return do_cost_internal(skill, 0, 1);

} /* do_cost() */

/** @ignore yes */
int do_cost_to( string skill, int num ) {
    return do_cost_internal( skill, num, 0 );
} /* do_cost_to() */

/** @ignore yes */
int do_cost_by( string skill, int num ) {
    return do_cost_internal( skill, 0, num );
} /* do_cost_to() */

/** @ignore yes */
varargs void set_teaching_skill( string skill ) { teaching_skill = skill; }

/** @ignore yes */
string query_teaching_skill() { return teaching_skill; }