dw_fluffos_v2/
dw_fluffos_v2/fluffos-2.9-ds2.05/
dw_fluffos_v2/fluffos-2.9-ds2.05/ChangeLog.old/
dw_fluffos_v2/fluffos-2.9-ds2.05/Win32/
dw_fluffos_v2/fluffos-2.9-ds2.05/compat/
dw_fluffos_v2/fluffos-2.9-ds2.05/compat/simuls/
dw_fluffos_v2/fluffos-2.9-ds2.05/include/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/clone/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/command/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/data/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/etc/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/include/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/inherit/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/inherit/master/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/log/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/single/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/single/tests/compiler/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/single/tests/efuns/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/single/tests/operators/
dw_fluffos_v2/fluffos-2.9-ds2.05/testsuite/u/
dw_fluffos_v2/fluffos-2.9-ds2.05/tmp/
dw_fluffos_v2/fluffos-2.9-ds2.05/windows/
dw_fluffos_v2/lib/
dw_fluffos_v2/lib/binaries/cmds/
dw_fluffos_v2/lib/binaries/cmds/creator/
dw_fluffos_v2/lib/binaries/cmds/living/
dw_fluffos_v2/lib/binaries/cmds/player/
dw_fluffos_v2/lib/binaries/d/admin/obj/
dw_fluffos_v2/lib/binaries/d/liaison/
dw_fluffos_v2/lib/binaries/global/virtual/
dw_fluffos_v2/lib/binaries/global/virtual/setup_compiler/
dw_fluffos_v2/lib/binaries/obj/handlers/autodoc/
dw_fluffos_v2/lib/binaries/obj/handlers/terrain_things/
dw_fluffos_v2/lib/binaries/obj/misc/
dw_fluffos_v2/lib/binaries/obj/misc/buckets/
dw_fluffos_v2/lib/binaries/obj/monster/
dw_fluffos_v2/lib/binaries/obj/reactions/
dw_fluffos_v2/lib/binaries/obj/reagents/
dw_fluffos_v2/lib/binaries/secure/cmds/creator/
dw_fluffos_v2/lib/binaries/secure/master/
dw_fluffos_v2/lib/binaries/std/
dw_fluffos_v2/lib/binaries/std/dom/
dw_fluffos_v2/lib/binaries/std/effects/object/
dw_fluffos_v2/lib/binaries/std/guilds/
dw_fluffos_v2/lib/binaries/std/languages/
dw_fluffos_v2/lib/binaries/std/races/
dw_fluffos_v2/lib/binaries/std/room/
dw_fluffos_v2/lib/binaries/std/room/basic/
dw_fluffos_v2/lib/binaries/std/shops/
dw_fluffos_v2/lib/binaries/std/shops/inherit/
dw_fluffos_v2/lib/binaries/www/
dw_fluffos_v2/lib/cmds/guild-race/
dw_fluffos_v2/lib/cmds/guild-race/crafts/
dw_fluffos_v2/lib/cmds/guild-race/other/
dw_fluffos_v2/lib/cmds/playtester/
dw_fluffos_v2/lib/cmds/playtester/senior/
dw_fluffos_v2/lib/d/admin/
dw_fluffos_v2/lib/d/admin/log/
dw_fluffos_v2/lib/d/admin/mapper/31-10-01/mapmaker/event/
dw_fluffos_v2/lib/d/admin/meetings/
dw_fluffos_v2/lib/d/admin/obj/
dw_fluffos_v2/lib/d/admin/room/we_care/
dw_fluffos_v2/lib/d/admin/save/
dw_fluffos_v2/lib/d/dist/
dw_fluffos_v2/lib/d/dist/mtf/
dw_fluffos_v2/lib/d/dist/pumpkin/
dw_fluffos_v2/lib/d/dist/pumpkin/chars/
dw_fluffos_v2/lib/d/dist/pumpkin/desert/
dw_fluffos_v2/lib/d/dist/pumpkin/gumboot/
dw_fluffos_v2/lib/d/dist/pumpkin/hospital/
dw_fluffos_v2/lib/d/dist/pumpkin/inherit/
dw_fluffos_v2/lib/d/dist/pumpkin/map/
dw_fluffos_v2/lib/d/dist/pumpkin/plain/
dw_fluffos_v2/lib/d/dist/pumpkin/pumpkin/
dw_fluffos_v2/lib/d/dist/pumpkin/save/
dw_fluffos_v2/lib/d/dist/pumpkin/squash/
dw_fluffos_v2/lib/d/dist/pumpkin/terrain/
dw_fluffos_v2/lib/d/dist/pumpkin/woods/
dw_fluffos_v2/lib/d/dist/start/
dw_fluffos_v2/lib/d/learning/TinyTown/buildings/
dw_fluffos_v2/lib/d/learning/TinyTown/map/
dw_fluffos_v2/lib/d/learning/TinyTown/roads/
dw_fluffos_v2/lib/d/learning/add_command/
dw_fluffos_v2/lib/d/learning/arms_and_weps/
dw_fluffos_v2/lib/d/learning/chars/
dw_fluffos_v2/lib/d/learning/cutnpaste/
dw_fluffos_v2/lib/d/learning/examples/npcs/
dw_fluffos_v2/lib/d/learning/examples/player_houses/npcs/
dw_fluffos_v2/lib/d/learning/examples/terrain_map/basic/
dw_fluffos_v2/lib/d/learning/functions/
dw_fluffos_v2/lib/d/learning/handlers/
dw_fluffos_v2/lib/d/learning/help_topics/npcs/
dw_fluffos_v2/lib/d/learning/help_topics/objects/
dw_fluffos_v2/lib/d/learning/help_topics/rcs_demo/
dw_fluffos_v2/lib/d/learning/help_topics/rooms/
dw_fluffos_v2/lib/d/learning/help_topics/rooms/crowd/
dw_fluffos_v2/lib/d/learning/help_topics/rooms/situations/
dw_fluffos_v2/lib/d/learning/items/
dw_fluffos_v2/lib/d/learning/save/
dw_fluffos_v2/lib/d/liaison/
dw_fluffos_v2/lib/d/liaison/NEWBIE/doc/
dw_fluffos_v2/lib/d/liaison/NEWBIE/save/oldlog/
dw_fluffos_v2/lib/db/
dw_fluffos_v2/lib/doc/
dw_fluffos_v2/lib/doc/creator/
dw_fluffos_v2/lib/doc/creator/autodoc/include/reaction/
dw_fluffos_v2/lib/doc/creator/autodoc/include/ritual_system/
dw_fluffos_v2/lib/doc/creator/autodoc/include/talker/
dw_fluffos_v2/lib/doc/creator/autodoc/include/terrain_map/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/baggage/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/clock/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/clothing/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/cont_save/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/corpse/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/money/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/monster/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/scabbard/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/service_provider/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/state_changer/
dw_fluffos_v2/lib/doc/creator/autodoc/obj/wand/
dw_fluffos_v2/lib/doc/creator/autodoc/std/book_dir/
dw_fluffos_v2/lib/doc/creator/autodoc/std/key/
dw_fluffos_v2/lib/doc/creator/autodoc/std/learning/
dw_fluffos_v2/lib/doc/creator/autodoc/std/map/
dw_fluffos_v2/lib/doc/creator/autodoc/std/race/
dw_fluffos_v2/lib/doc/creator/autodoc/std/weapon_logic/
dw_fluffos_v2/lib/doc/creator/files/
dw_fluffos_v2/lib/doc/creator/policy/
dw_fluffos_v2/lib/doc/creator/room/
dw_fluffos_v2/lib/doc/effects/
dw_fluffos_v2/lib/doc/ideas/
dw_fluffos_v2/lib/doc/known_command/
dw_fluffos_v2/lib/doc/lpc/basic_manual/
dw_fluffos_v2/lib/doc/lpc/intermediate/
dw_fluffos_v2/lib/doc/new/add_command/
dw_fluffos_v2/lib/doc/new/handlers/
dw_fluffos_v2/lib/doc/new/living/
dw_fluffos_v2/lib/doc/new/living/race/
dw_fluffos_v2/lib/doc/new/living/spells/
dw_fluffos_v2/lib/doc/new/player/
dw_fluffos_v2/lib/doc/new/room/guild/
dw_fluffos_v2/lib/doc/new/room/outside/
dw_fluffos_v2/lib/doc/new/room/storeroom/
dw_fluffos_v2/lib/doc/object/
dw_fluffos_v2/lib/doc/playtesters/
dw_fluffos_v2/lib/doc/policy/
dw_fluffos_v2/lib/doc/weapons/
dw_fluffos_v2/lib/global/handlers/
dw_fluffos_v2/lib/global/virtual/setup_compiler/
dw_fluffos_v2/lib/include/
dw_fluffos_v2/lib/include/cmds/
dw_fluffos_v2/lib/include/effects/
dw_fluffos_v2/lib/include/npc/
dw_fluffos_v2/lib/include/shops/
dw_fluffos_v2/lib/net/daemon/chars/
dw_fluffos_v2/lib/net/inherit/
dw_fluffos_v2/lib/net/intermud3/
dw_fluffos_v2/lib/net/intermud3/services/
dw_fluffos_v2/lib/net/obj/
dw_fluffos_v2/lib/net/save/
dw_fluffos_v2/lib/net/smnmp/
dw_fluffos_v2/lib/net/snmp/
dw_fluffos_v2/lib/obj/amulets/
dw_fluffos_v2/lib/obj/b_day/
dw_fluffos_v2/lib/obj/examples/
dw_fluffos_v2/lib/obj/food/alcohol/
dw_fluffos_v2/lib/obj/food/chocolates/
dw_fluffos_v2/lib/obj/food/fruits/
dw_fluffos_v2/lib/obj/food/meat/
dw_fluffos_v2/lib/obj/food/nuts/
dw_fluffos_v2/lib/obj/food/seafood/
dw_fluffos_v2/lib/obj/food/vegetables/
dw_fluffos_v2/lib/obj/fungi/
dw_fluffos_v2/lib/obj/furnitures/artwork/
dw_fluffos_v2/lib/obj/furnitures/bathroom/
dw_fluffos_v2/lib/obj/furnitures/beds/
dw_fluffos_v2/lib/obj/furnitures/cabinets/
dw_fluffos_v2/lib/obj/furnitures/chairs/
dw_fluffos_v2/lib/obj/furnitures/chests/
dw_fluffos_v2/lib/obj/furnitures/clocks/
dw_fluffos_v2/lib/obj/furnitures/crockery/
dw_fluffos_v2/lib/obj/furnitures/cupboards/
dw_fluffos_v2/lib/obj/furnitures/cushions/
dw_fluffos_v2/lib/obj/furnitures/fake_plants/
dw_fluffos_v2/lib/obj/furnitures/lamps/
dw_fluffos_v2/lib/obj/furnitures/mirrors/
dw_fluffos_v2/lib/obj/furnitures/outdoor/
dw_fluffos_v2/lib/obj/furnitures/safes/
dw_fluffos_v2/lib/obj/furnitures/shelves/
dw_fluffos_v2/lib/obj/furnitures/sideboards/
dw_fluffos_v2/lib/obj/furnitures/sofas/
dw_fluffos_v2/lib/obj/furnitures/stoves/
dw_fluffos_v2/lib/obj/furnitures/tables/
dw_fluffos_v2/lib/obj/furnitures/wardrobes/
dw_fluffos_v2/lib/obj/handlers/
dw_fluffos_v2/lib/obj/handlers/autodoc/
dw_fluffos_v2/lib/obj/jewellery/anklets/
dw_fluffos_v2/lib/obj/jewellery/bracelets/
dw_fluffos_v2/lib/obj/jewellery/earrings/
dw_fluffos_v2/lib/obj/jewellery/misc/
dw_fluffos_v2/lib/obj/jewellery/necklaces/
dw_fluffos_v2/lib/obj/jewellery/rings/
dw_fluffos_v2/lib/obj/media/
dw_fluffos_v2/lib/obj/misc/buckets/
dw_fluffos_v2/lib/obj/misc/jars/
dw_fluffos_v2/lib/obj/misc/papers/
dw_fluffos_v2/lib/obj/misc/player_shop/
dw_fluffos_v2/lib/obj/misc/shops/
dw_fluffos_v2/lib/obj/misc/traps/
dw_fluffos_v2/lib/obj/monster/
dw_fluffos_v2/lib/obj/monster/godmother/
dw_fluffos_v2/lib/obj/monster/transport/
dw_fluffos_v2/lib/obj/plants/inherit/
dw_fluffos_v2/lib/obj/potions/
dw_fluffos_v2/lib/open/boards/
dw_fluffos_v2/lib/save/autodoc/
dw_fluffos_v2/lib/save/bank_accounts/
dw_fluffos_v2/lib/save/boards/frog/
dw_fluffos_v2/lib/save/books/bed_catalog/
dw_fluffos_v2/lib/save/creators/
dw_fluffos_v2/lib/save/mail/
dw_fluffos_v2/lib/save/mail/p/
dw_fluffos_v2/lib/save/soul/data/
dw_fluffos_v2/lib/save/tasks/
dw_fluffos_v2/lib/save/vaults/
dw_fluffos_v2/lib/secure/cmds/lord/
dw_fluffos_v2/lib/secure/config/
dw_fluffos_v2/lib/secure/items/
dw_fluffos_v2/lib/secure/player/
dw_fluffos_v2/lib/soul/
dw_fluffos_v2/lib/soul/i/
dw_fluffos_v2/lib/soul/j/
dw_fluffos_v2/lib/soul/k/
dw_fluffos_v2/lib/soul/o/
dw_fluffos_v2/lib/soul/q/
dw_fluffos_v2/lib/soul/to_approve/
dw_fluffos_v2/lib/soul/u/
dw_fluffos_v2/lib/soul/v/
dw_fluffos_v2/lib/soul/wish_list/
dw_fluffos_v2/lib/soul/y/
dw_fluffos_v2/lib/soul/z/
dw_fluffos_v2/lib/std/creator/
dw_fluffos_v2/lib/std/effects/
dw_fluffos_v2/lib/std/effects/attached/
dw_fluffos_v2/lib/std/effects/external/
dw_fluffos_v2/lib/std/effects/fighting/
dw_fluffos_v2/lib/std/effects/other/
dw_fluffos_v2/lib/std/environ/
dw_fluffos_v2/lib/std/guilds/
dw_fluffos_v2/lib/std/hospital/
dw_fluffos_v2/lib/std/house/
dw_fluffos_v2/lib/std/house/onebedhouse/
dw_fluffos_v2/lib/std/house/onebedhut/
dw_fluffos_v2/lib/std/house/tworoomflat/
dw_fluffos_v2/lib/std/languages/
dw_fluffos_v2/lib/std/liquids/
dw_fluffos_v2/lib/std/nationality/
dw_fluffos_v2/lib/std/nationality/accents/
dw_fluffos_v2/lib/std/nationality/accents/national/
dw_fluffos_v2/lib/std/nationality/accents/regional/
dw_fluffos_v2/lib/std/npc/goals/
dw_fluffos_v2/lib/std/npc/goals/basic/
dw_fluffos_v2/lib/std/npc/goals/misc/
dw_fluffos_v2/lib/std/npc/inherit/
dw_fluffos_v2/lib/std/npc/plans/
dw_fluffos_v2/lib/std/npc/plans/basic/
dw_fluffos_v2/lib/std/outsides/
dw_fluffos_v2/lib/std/races/shadows/
dw_fluffos_v2/lib/std/room/basic/topography/
dw_fluffos_v2/lib/std/room/controller/
dw_fluffos_v2/lib/std/room/controller/topography/
dw_fluffos_v2/lib/std/room/furniture/games/
dw_fluffos_v2/lib/std/room/furniture/inherit/
dw_fluffos_v2/lib/std/room/inherit/carriage/
dw_fluffos_v2/lib/std/room/inherit/topography/
dw_fluffos_v2/lib/std/room/punishments/
dw_fluffos_v2/lib/std/room/topography/area/
dw_fluffos_v2/lib/std/room/topography/iroom/
dw_fluffos_v2/lib/std/room/topography/milestone/
dw_fluffos_v2/lib/std/shadows/
dw_fluffos_v2/lib/std/shadows/attached/
dw_fluffos_v2/lib/std/shadows/curses/
dw_fluffos_v2/lib/std/shadows/disease/
dw_fluffos_v2/lib/std/shadows/fighting/
dw_fluffos_v2/lib/std/shadows/room/
dw_fluffos_v2/lib/std/shops/controllers/
dw_fluffos_v2/lib/std/shops/objs/
dw_fluffos_v2/lib/std/shops/player_shop/
dw_fluffos_v2/lib/std/shops/player_shop/office_code/
dw_fluffos_v2/lib/std/socket/
dw_fluffos_v2/lib/www/
dw_fluffos_v2/lib/www/external/autodoc/
dw_fluffos_v2/lib/www/external/java/telnet/Documentation/
dw_fluffos_v2/lib/www/external/java/telnet/Documentation/images/
dw_fluffos_v2/lib/www/external/java/telnet/examples/
dw_fluffos_v2/lib/www/external/java/telnet/tools/
dw_fluffos_v2/lib/www/pics/
dw_fluffos_v2/lib/www/secure/creator/
dw_fluffos_v2/lib/www/secure/editors/
dw_fluffos_v2/lib/www/secure/survey_results/
dw_fluffos_v2/win32/
/**
 * Mancala - an african game of stones.
 * @author Pinkfish
 * @started Mon Dec 11 08:49:30 PST 2000
 */
inherit "/obj/furnitures/misc/games/multiplayer_base";
inherit "/std/room/furniture/basic";

class co_ord {
   int x;
   int y;
}

private int* _board;
private mapping _mancala;

#define LOAD_TAG "mancala"
#define SIDE_LENGTH 6

void create() {
   multiplayer_base::create();
   basic::create();
} /* create() */

void setup() {
   set_short("mancala board");
   add_adjective("mancala");
   add_alias("mancala");
   set_name("board");

   set_long("A small rectangular board with 6 dips on each side and two "
            "bigger dips at each end.  There are a bunch of small multi-"
            "coloured stones in the dips.\n");

   add_player_id_type("green", 0);
   add_player_id_type("red", 0);

   set_minimum_needed(2);

   add_help_file("mancala");

   reset_game();
} /* setup() */

/**
 * This method resets the board to the start position.
 */
void reset_game() {
   _board = allocate(12, (: 4 :));
   _mancala = ([ "red" : 0, "green" : 0 ]);
} /* reset_game() */

/**
 * This method is called to start the game.
 */
int start_game() {
   randomise_player_numbers();
   if (!::start_game()) {
      return 0;
   }

   reset_game();
   return 1;
} /* start_game() */

/**
 * The board itself.
 * @return the board string
 */
string query_board_string() {
   string ret;
   string id;
   int i;

   ret = "";
   foreach (id in query_player_ids()) {
      ret += sprintf("%-25s %s\n",
             query_player_cap_name(id) + " (" + capitalize(id) + ")",
             (is_game_started() && query_current_player() == id?"<-- Their turn":""));
   }

   ret += "                  ------->\n";
   ret += "%^RED%^+--+%^RESET%^   %^GREEN%^";
   for (i = 0; i < SIDE_LENGTH; i++) {
      ret += "+--+ ";
   }
   ret += "   +--+%^RESET%^\n";

   ret += "%^RED%^|  |%^RESET%^   %^GREEN%^";
   for (i = 0; i < SIDE_LENGTH; i++) {
      ret += sprintf("|%2d| ", _board[i]);
   }
   ret += "   |  |%^RESET%^\n";

   ret += "%^RED%^|  |   %^GREEN%^";
   for (i = 0; i < SIDE_LENGTH; i++) {
      ret += "+--+ ";
   }
   ret += "   |  |%^RESET%^\n";

   ret += sprintf("%%^RED%%^|%2d|%%^RESET%%^   ", _mancala["red"]);
   for (i = 0; i < SIDE_LENGTH; i++) {
      ret += "     ";
   }
   ret += sprintf("   %%^GREEN%%^|%2d|%%^RESET%%^\n", _mancala["green"]);

   ret += "%^RED%^|  |   ";
   for (i = 0; i < SIDE_LENGTH; i++) {
      ret += "+--+ ";
   }
   ret += "   %^GREEN%^|  |%^RESET%^\n";

   ret += "%^RED%^|  |   ";
   for (i = 1; i <= SIDE_LENGTH; i++) {
      ret += sprintf("|%2d| ", _board[2 * SIDE_LENGTH - i]);
   }
   ret += "   %^GREEN%^|  |%^RESET%^\n";

   ret += "%^RED%^+--+   ";
   for (i = 0; i < SIDE_LENGTH; i++) {
      ret += "+--+ ";
   }
   ret += "   %^GREEN%^+--+%^RESET%^\n";

   ret += "                 <-------\n";
   ret += "       ";
   for (i = 0; i < SIDE_LENGTH; i++) {
      ret += sprintf("  %c  ", i + 'A');
   }
   ret += "\n";

   if (query_winner()) {
      ret += "The last winner was " + query_winner() + ".\n";
   }

   return ret;
} /* query_board_string() */

string long() {
   return ::long() + query_board_string();
} /* long() */

/**
 * This method checks to see if there is a 4 in a row on the board somewhere.
 */
int check_winner(class co_ord pos) {
   return 0;
} /* check_winner() */

/**
 * This method returns the location as a string.
 * @param loc the location to look at
 * @return the string version of it
 */
string query_location_string(int loc) {
   if (loc < SIDE_LENGTH) {
      return sprintf("green %c", loc + 'A');
   }
   return sprintf("red %c", 2 * SIDE_LENGTH - loc + 'A' - 1);
} /* query_location_string() */

/**
 * The bin on the opposite side.
 */
int query_opposite_side(int loc) {
   if (loc < SIDE_LENGTH) {
      return 2 * SIDE_LENGTH - loc - 1;
   }
   return SIDE_LENGTH - 1 - (loc % (SIDE_LENGTH));
} /* query_opposite_side() */

/**
 * This method checks to see if the game has ended, and ends the game
 * if it has.
 */
int check_end() {
   int empty;
   int i;

   //
   // If all of one side is empty, sweep the other side.
   //
   empty = 1;
   for (i = 0; i < SIDE_LENGTH; i++) {
      if (_board[i]) {
         empty = 0;
      }
   }

   if (empty) {
      for (i = 0; i < SIDE_LENGTH; i++) {
         _mancala["red"] += _board[i + SIDE_LENGTH];
         _board[i + SIDE_LENGTH] = 0;;
      }
   } else {
      empty = 1;
      for (i = 0; i < SIDE_LENGTH; i++) {
         if (_board[i + SIDE_LENGTH]) {
            empty = 0;
         }
      }
      if (empty) {
         for (i = 0; i < SIDE_LENGTH; i++) {
            _mancala["green"] += _board[i];
            _board[i] = 0;
         }
      }
   }

   if (empty) {
      if (_mancala["red"] > _mancala["green"]) {
         finish_game(query_player_cap_name("red"));
      } else if (_mancala["red"] < _mancala["green"]) {
         finish_game(query_player_cap_name("green"));
      } else {
         finish_game(query_player_cap_name("green") + " and " +
                     query_player_cap_name("red"));
      }
   }
   return empty;
} /* check_end() */

/**
 * This method makes a move and chooses the next piece for the other player.
 * @param pos the position to play the piece
 * @param next the next piece to choose
 */
int do_move(string pos_str) {
   int i;
   int pos;
   int num;
   int loc;
   int my_mancala;
   int my_cutoff;
   int my_cutoff_bot;
   int last_mancala;

   if (!is_game_started()) {
      add_failed_mess("The game has not started.\n");
      return 0;
   }

   if (!is_current_player(this_player())) {
      add_failed_mess("It is not your go!\n");
      return 0;
   }

   pos = lower_case(pos_str)[0] - 'a';
   if (pos < 0 || pos >= SIDE_LENGTH || strlen(pos_str) > 1) {
      add_failed_mess("The next piece reference " + pos_str +
                      " is not valid on $D.\n");
      return 0;
   }

   if (query_current_player() == "red") {
      pos = SIDE_LENGTH * 2 - pos - 1;
      my_mancala = 0;
      my_cutoff = 12;
      my_cutoff_bot = 6;
   } else {
      my_mancala = SIDE_LENGTH;
      my_cutoff = 6;
      my_cutoff_bot = 0;
   }

   if (!_board[pos]) {
      add_failed_mess("You can only play from a bin that has stones in it.\n");
      return 0;
   }

   num = _board[pos];
   _board[pos] = 0;
   for (i = 1; i <= num; i++) {
      loc = (pos + i) % (2 * SIDE_LENGTH);
      if (!((pos + i) % SIDE_LENGTH) && loc == my_mancala) {
         //
         // See if we stick a stone in the mancala or not.
         //
         _mancala[query_current_player()]++;
         num--;
         last_mancala = 1;
      }
      if (i <= num) {
         _board[loc]++;
         last_mancala = 0;
      }
   }

   if (!last_mancala &&
       _board[loc] == 1 &&
       loc < my_cutoff &&
       loc >= my_cutoff_bot) {
      //
      // We might do a capture!
      //
      i = query_opposite_side(loc);
      if (_board[i]) {
         add_succeeded_mess("$N capture$s " + query_num(_board[i]) +
                            " pieces from " + query_location_string(i) + ".\n");
         _mancala[query_current_player()] += _board[i] + 1;
         _board[i] = 0;
         _board[loc] = 0;
      }
   }


   if (check_end()) {
      add_succeeded_mess("$N end$s the game and " + query_winner() + " wins "
                         "on $D.\n");
   } else {
      add_succeeded_mess("$N start$s from " + query_location_string(pos) +
                         " and goes to " +
                         query_location_string(loc) + ".\n");

      if (!last_mancala) {
         increment_current_player();
         tell_current_player("%^BOLD%^Your turn!%^RESET%^\n" +
                             query_board_string());
      } else {
         tell_current_player("%^BOLD%^Your turn!%^RESET%^\n" +
                             query_board_string());
      }
   }

   return 1;
} /* do_move() */

/**
 * This method starts a new game.
 */
int do_start() {
   if (!is_playing(this_player())) {
      add_failed_mess("You must be playing the game to start it.\n");
      return 0;
   }

   if (!start_game()) {
      add_failed_mess("You need two people to play Quarto.\n");
      return 0;
   }

   add_succeeded_mess("$N $V a game of $D.\n");
   increment_current_player();
   tell_current_player("%^BOLD%^Your turn!%^RESET%^\n" +
                       query_board_string());
   tell_all_players(query_player_cap_name(query_current_player()) +
                    " goes first!\n", ({ query_current_player() }));
   return 1;
} /* do_start() */

void init() {
   ::init();
   add_command("move",
               "<string'position'> on <direct:object>",
               (: do_move($4[0]) :));
   add_command("start", "[new] [game] on <direct:object>", (: do_start() :));
} /* init() */

/** @ignore yes */
mapping query_dynamic_auto_load() {
   mapping map;

   map = basic::query_dynamic_auto_load();
   multiplayer_base::query_dynamic_auto_load(map);
   add_auto_load_value(map, LOAD_TAG, "board", _board);
   add_auto_load_value(map, LOAD_TAG, "mancala", _mancala);
   return map;
} /* query_dynamic_arg() */

/** @ignore yes */
void init_dynamic_arg(mapping map, object player) {
   basic::init_dynamic_arg(map, player);
   multiplayer_base::init_dynamic_arg(map, player);
   _board = query_auto_load_value(map, LOAD_TAG, "board");
   _mancala = query_auto_load_value(map, LOAD_TAG, "mancala");
} /* init_dynamic_arg() */