SaveText.Ru

comm.c
  1. /***************************************************************************
  2.  *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
  3.  *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
  4.  *                                                                         *
  5.  *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
  6.  *  Chastain, Michael Quan, and Mitchell Tse.                              *
  7.  *                                                                         *
  8.  *   order to use any part of this Merc Diku Mud, you must comply with     *
  9.  *  both the original Diku license in 'license.doc' as well the Merc       *
  10.  *  license in 'license.txt'.  In particular, you may not remove either of *
  11.  *  these copyright notices.                                               *
  12.  *                                                                         *
  13.  *  Thanks to abaddon for proof-reading our comm.c and pointing out bugs.  *
  14.  *  Any remaining bugs are, of course, our work, not his.  :)              *
  15.  *                                                                         *
  16.  *  Much time and thought has gone into this software and you are          *
  17.  *  benefitting.  We hope that you share your changes too.  What goes      *
  18.  *  around, comes around.                                                  *
  19.  ***************************************************************************/
  20. /***************************************************************************
  21.  *      ROM 2.4 is copyright 1993-1998 Russ Taylor                         *
  22.  *      ROM has been brought to you by the ROM consortium                  *
  23.  *          Russ Taylor ([email protected])                            *
  24.  *          Gabrielle Taylor ([email protected])                       *
  25.  *          Brian Moore ([email protected])                                     *
  26.  *      By using this code, you have agreed to follow the terms of the     *
  27.  *      ROM license, in the file Rom24/doc/rom.license                     *
  28.  ***************************************************************************/
  29.  
  30. /*
  31.  * This file contains all of the OS-dependent stuff:
  32.  *   startup, signals, BSD sockets for tcp/ip, i/o, timing.
  33.  *
  34.  * The data flow for input is:
  35.  *    Game_loop ---> Read_from_descriptor ---> Read
  36.  *    Game_loop ---> Read_from_buffer
  37.  *
  38.  * The data flow for output is:
  39.  *    Game_loop ---> Process_Output ---> Write_to_descriptor -> Write
  40.  *
  41.  * The OS-dependent functions are Read_from_descriptor and Write_to_descriptor.
  42.  * -- Furey  26 Jan 1993
  43.  */
  44.  
  45. #include <sys/types.h>
  46. #include <sys/time.h>
  47.  
  48.  
  49. #include <ctype.h>
  50. #include <errno.h>
  51. #include <stdio.h>
  52. #include <string.h>
  53. #include <stdlib.h>
  54. #include <stdarg.h>
  55. #include <locale.h>
  56. #include <time.h>
  57.  
  58. /* This removes annoying warnings (FreeBSD) */
  59. #include <unistd.h>
  60.  
  61. #ifndef WIN32
  62. #include <netinet/in.h>
  63. #include <arpa/inet.h>
  64. #endif
  65.  
  66. //static char const rcsid[] =
  67.   //  "$Id: comm.c,v 1.147.2.189 2014/01/27 19:31:21 mud Exp $";
  68.  
  69. extern int reboot_time;
  70.  
  71. /*
  72.  * Signal handling.
  73.  * Apollo has a problem with __attribute(atomic) in signal.h,
  74.  *   I dance around it.
  75.  */
  76. #if defined(apollo)
  77. #define __attribute(x)
  78. #endif
  79.  
  80. #include <signal.h>
  81.  
  82. #if defined(apollo)
  83. #undef __attribute
  84. #endif
  85.  
  86. extern char *help_greeting;
  87.  
  88.  
  89. /*
  90.  * Socket and TCP/IP stuff.
  91.  */
  92.  
  93. #include <fcntl.h>
  94. #ifndef WIN32
  95. #include <netdb.h>
  96. #include <netinet/in.h>
  97. #include <sys/socket.h>
  98. #endif
  99. #include "telnet.h"
  100. unsigned char   echo_off_str    [] = { IAC, WILL, TELOPT_ECHO, '' };
  101. unsigned char   echo_on_str     [] = { IAC, WONT, TELOPT_ECHO, '' };
  102. unsigned char   echo_do_str     [] = { IAC, DO_ , TELOPT_ECHO, '' };
  103. unsigned char   echo_dont_str   [] = { IAC, DONT, TELOPT_ECHO, '' };
  104.  
  105. const unsigned char     go_ahead_str    [] = { IAC, GA, '' };
  106. const unsigned char     telopt_binary   [] = { IAC, DO_,  TELOPT_BINARY, '' };
  107. const unsigned char     eor_on_str      [] = { IAC, WILL, TELOPT_EOR, '' };
  108.  
  109. /* mccp: compression negotiation strings */
  110. const unsigned char     compress_will [] = { IAC, WILL, TELOPT_COMPRESS,  ''};
  111. const unsigned char     compress_do   [] = { IAC, DO_,  TELOPT_COMPRESS,  ''};
  112. const unsigned char     compress_dont [] = { IAC, DONT, TELOPT_COMPRESS,  ''};
  113. const unsigned char     compress_will2[] = { IAC, WILL, TELOPT_COMPRESS2, ''};
  114. const unsigned char     compress_do2  [] = { IAC, DO_,  TELOPT_COMPRESS2, ''};
  115. const unsigned char     compress_dont2[] = { IAC, DONT, TELOPT_COMPRESS2, ''};
  116. const unsigned char     compress_wont [] = { IAC, WONT, TELOPT_COMPRESS,  ''};
  117.  
  118. const unsigned char     compress_wont2[] = { IAC, WONT, TELOPT_COMPRESS2, ''};
  119.  
  120.  
  121. /* MXP support */
  122. const unsigned char     will_mxp_str [] = { IAC, WILL, TELOPT_MXP, '' };
  123. const unsigned char     start_mxp_str[] = { IAC, SB, TELOPT_MXP, IAC, SE, ''};
  124. const unsigned char     do_mxp_str   [] = { IAC, DO_, TELOPT_MXP, '' };
  125. const unsigned char     dont_mxp_str [] = { IAC, DONT, TELOPT_MXP, '' };
  126. const unsigned char     wont_mxp_str [] = { IAC, WONT, TELOPT_MXP, '' };
  127.  
  128. #define IN_COMM_C
  129.  
  130. /* Our headers was moved here due to conflicts in linux signal.h */
  131. #include "merc.h"
  132. #if defined(__CYGWIN32__)
  133. #include "cygwin.h"
  134. #endif
  135. #include "interp.h"
  136. #include "recycle.h"
  137. #include "olc.h"
  138. #include "config.h"
  139.  
  140.  
  141.  
  142.  
  143. void install_other_handlers args((void));
  144.  
  145. /*
  146.  * Global variables.
  147.  */
  148. /* All open descriptors         */
  149. SLIST_HEAD(, descriptor_data) descriptor_list = SLIST_HEAD_INITIALIZER(descriptor_list);
  150.  
  151. FILE *              fpReserve;          /* Reserved file handle         */
  152. bool                merc_down;          /* Shutdown                     */
  153. time_t              boot_time;
  154. time_t              current_time;       /* time of this pulse */
  155. bool                MOBtrigger = TRUE;  /* act() switch                 */
  156.  
  157.  
  158.  
  159.  
  160. /*
  161.  * OS-dependent local functions.
  162.  */
  163. bool    read_from_descriptor    args((DESCRIPTOR_DATA *d));
  164. /* bool write_to_descriptor     args((DESCRIPTOR_DATA *d, char *txt, int length)); */
  165.  
  166. bool    write_to_descriptor     args((DESCRIPTOR_DATA *d, char *txt, int length));
  167. #ifndef WIN32
  168. void    game_loop_unix          args((int control));
  169. bool    write_to_descriptor_2   args((int d, char *txt, int length));
  170. void    init_descriptor         args((int control));
  171. int     init_socket             args((int port));
  172. #else
  173. void    game_loop_unix          args((SOCKET control));
  174. bool    write_to_descriptor_2   args((SOCKET d, char *txt, int length));
  175. void    init_descriptor         args((SOCKET control));
  176. SOCKET  init_socket             args((int port));
  177. #endif
  178.  
  179.  
  180. #if !defined(__CYGWIN32__)
  181. extern          char                    last_command[MAX_STRING_LENGTH];
  182. void init_signals   args((void));
  183. sig_t  sig_bus, sig_term, sig_abrt, sig_segv;
  184. static int sig_counter = 0;
  185. #endif
  186.  
  187.  
  188. char    *direct(unsigned char dir, bool go);
  189. void    generate_character_password(CHAR_DATA *ch);
  190. void    do_email_pass(CHAR_DATA *ch, char *argument);
  191.  
  192.  
  193. /********** Constants for recode: *********************************************/
  194. typedef unsigned char uchar;
  195.  
  196. /* Alternative -> Windows (CP1251) */
  197. uchar aw[] =
  198. {
  199.     192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
  200.     208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
  201.     224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
  202.     136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
  203.     152, 153, 154, 129, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,
  204.     168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,
  205.     240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255,
  206.     130, 132, 135, 134, 128, 133, 131, 155, 184, 185, 186, 187, 188, 189, 190, 191
  207. };
  208.  
  209. /* KOI8 -> Windows (CP1251) */
  210. uchar kw[] =
  211. {
  212.     128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
  213.     144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
  214.     160, 161, 162, 184, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
  215.     176, 177, 178, 168, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
  216.     254, 224, 225, 246, 228, 229, 244, 227, 245, 232, 233, 234, 235, 236, 237, 238,
  217.     239, 255, 240, 241, 242, 243, 230, 226, 252, 251, 231, 248, 253, 249, 247, 250,
  218.     222, 192, 193, 214, 196, 197, 212, 195, 213, 200, 201, 202, 203, 204, 205, 206,
  219.     207, 223, 208, 209, 210, 211, 198, 194, 220, 219, 199, 216, 221, 217, 215, 218
  220. };
  221.  
  222. /* Windows (CP1251) -> Alternative */
  223. uchar wa[] =
  224. {
  225.     244, 195, 240, 246, 241, 245, 243, 242, 176, 177, 178, 179, 180, 181, 182, 183,
  226.     184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 247, 196, 197, 198, 199,
  227.     200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
  228.     216, 217, 218, 219, 220, 221, 222, 223, 248, 249, 250, 251, 252, 253, 254, 255,
  229.     128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
  230.     144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
  231.     160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
  232.     224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
  233. };
  234.  
  235.  
  236. /* Windows (CP1251) -> KOI8 */
  237. uchar wk[] =
  238. {
  239.     128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
  240.     144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
  241.     160, 161, 162, 163, 164, 165, 166, 167, 179, 169, 170, 171, 172, 173, 174, 175,
  242.     176, 177, 178, 179, 180, 181, 182, 183, 163, 185, 186, 187, 188, 189, 190, 191,
  243.     225, 226, 247, 231, 228, 229, 246, 250, 233, 234, 235, 236, 237, 238, 239, 240,
  244.     242, 243, 244, 245, 230, 232, 227, 254, 251, 253, 255, 249, 248, 252, 224, 241,
  245.     193, 194, 215, 199, 196, 197, 214, 218, 201, 202, 203, 204, 205, 206, 207, 208,
  246.     210, 211, 212, 213, 198, 200, 195, 222, 219, 221, 223, 217, 216, 220, 192, 209
  247. };
  248.  
  249. /* MAC -> Windows (CP1251) */
  250. uchar mw[] =
  251. {
  252.     192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
  253.     208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
  254.     134, 176, 63, 63, 167, 149, 182, 178, 174, 169, 153, 128, 144, 63, 129, 131,
  255.     63, 177, 63, 63, 179, 181, 63, 163, 170, 186, 175, 191, 138, 154, 140, 156,
  256.     188, 189, 172, 118, 63, 63, 63, 171, 187, 133, 160, 142, 158, 141, 157, 190,
  257.     150, 151, 147, 148, 145, 146, 63, 132, 161, 162, 143, 159, 185, 168, 184, 255,
  258.     224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
  259.     240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 164
  260. };
  261.  
  262. /* Windows (CP1251) -> MAC */
  263. uchar wm[] =
  264. {
  265.     171, 174, 63, 175, 215, 201, 160, 63, 63, 63, 188, 63, 190, 205, 203, 218,
  266.     172, 212, 213, 210, 211, 165, 208, 209, 63, 170, 189, 63, 191, 206, 204, 219,
  267.     202, 216, 217, 183, 255, 63, 63, 164, 221, 169, 184, 199, 194, 63, 168, 186,
  268.     161, 177, 167, 180, 63, 181, 166, 63, 222, 220, 185, 200, 192, 193, 207, 187,
  269.     128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
  270.     144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
  271.     224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
  272.     240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 223
  273. };
  274.  
  275.  
  276. struct translit_type
  277. {
  278.     char        rus;
  279.     char        eng[3];
  280. };
  281.  
  282. struct translit_type            translit        []      = {
  283.     {'Ч', "CH"},
  284.     {'ч', "ch"},
  285.     {'Ш', "SH" },
  286.     {'ш', "sh" },
  287.     {'Щ', "SH"},
  288.     {'щ', "sh"},
  289.     {'Й', "YJ" },
  290.     {'й', "yj" },
  291.     {'Ю', "YU"},
  292.     {'ю', "yu"},
  293.     {'Я', "YA"},
  294.     {'я', "ya"},
  295.     {'А', "A"} ,
  296.     {'а', "a"} ,
  297.     {'Б', "B"} ,
  298.     {'б', "b"} ,
  299.     {'В', "V"} ,
  300.     {'в', "v"} ,
  301.     {'Г', "G"} ,
  302.     {'г', "g"} ,
  303.     {'Д', "D"} ,
  304.     {'д', "d"} ,
  305.     {'Е', "E"} ,
  306.     {'е', "e"} ,
  307.     {'Ё', "E"} ,
  308.     {'ё', "e"} ,
  309.     {'Ж', "J"} ,
  310.     {'ж', "j"} ,
  311.     {'З', "Z"} ,
  312.     {'з', "z"} ,
  313.     {'И', "I"} ,
  314.     {'и', "i"} ,
  315.     {'К', "K"} ,
  316.     {'к', "k"} ,
  317.     {'Л', "L"} ,
  318.     {'л', "l"} ,
  319.     {'М', "M"} ,
  320.     {'м', "m"} ,
  321.     {'Н', "N"} ,
  322.     {'н', "n"} ,
  323.     {'О', "O"} ,
  324.     {'о', "o"} ,
  325.     {'П', "P"} ,
  326.     {'п', "p"} ,
  327.     {'Р', "R"} ,
  328.     {'р', "r"} ,
  329.     {'С', "S"} ,
  330.     {'с', "s"} ,
  331.     {'Т', "T"} ,
  332.     {'т', "t"} ,
  333.     {'У', "U"} ,
  334.     {'у', "u"} ,
  335.     {'Ф', "F"} ,
  336.     {'ф', "f"} ,
  337.     {'Х', "H"} ,
  338.     {'х', "h"} ,
  339.     {'Ь', "'"} ,
  340.     {'ь', "'"} ,
  341.     {'Ъ', "'"} ,
  342.     {'ъ', "'"} ,
  343.     {'Ц', "C"},
  344.     {'ц', "c"},
  345.     {'Ы', "Y"},
  346.     {'ы', "y"},
  347.     {'Э', "E"},
  348.     {'э', "e"},
  349.     {'', ""}
  350. };
  351.  
  352.  
  353. struct antitrigger_type
  354. {
  355.     char        rus;
  356.     char        eng;
  357. };
  358.  
  359. struct antitrigger_type         antitrigger     []      = {
  360.     {'а', 'a'},
  361.     {'е', 'e'},
  362.     {'о', 'o'},
  363.     {'р', 'p'},
  364.     {'с', 'c'},
  365.     {'х', 'x'},
  366.     {'А', 'A'},
  367.     {'В', 'B'},
  368.     {'Е', 'E'},
  369.     {'М', 'M'},
  370.     {'Н', 'H'},
  371.     {'О', 'O'},
  372.     {'Р', 'P'},
  373.     {'С', 'C'},
  374.     {'Т', 'T'},
  375.     {'Х', 'X'},
  376.     {'',''}
  377. };
  378.  
  379.  
  380. void init_aspell();
  381. /*
  382.  * Other local functions (OS-independent).
  383.  */
  384. bool    check_parse_name        args((char *name));
  385.  
  386. bool    check_reconnect         args((DESCRIPTOR_DATA *d, char *name,
  387.                                       bool fConn));
  388. bool    check_playing           args((DESCRIPTOR_DATA *d, char *name));
  389. int     main                    args((int argc, char *argv[]));
  390. void    nanny                   args((DESCRIPTOR_DATA *d, char *argument));
  391. bool    process_output          args((DESCRIPTOR_DATA *d, bool fPrompt));
  392. void    read_from_buffer        args((DESCRIPTOR_DATA *d));
  393. void    stop_idling             args((CHAR_DATA *ch));
  394. void    bust_a_prompt           args((CHAR_DATA *ch));
  395.  
  396.  
  397. /* set up MXP */
  398. void turn_on_mxp (DESCRIPTOR_DATA *d)
  399. {
  400.     d->mxp = TRUE;  /* turn it on now */
  401.  
  402.     /*  write(d->descriptor, start_mxp_str, strlen(start_mxp_str)); */
  403.  
  404.     write_to_buffer(d, MXPMODE (6), 0);   /* permanent secure mode */
  405.     write_to_buffer(d, MXPTAG ("!-- Set up MXP elements --"), 0);
  406.     /* Exit tag */
  407.     write_to_buffer(d, MXPTAG ("!ELEMENT Ex '<send>' FLAG=RoomExit"), 0);
  408.     /* Room description tag */
  409.     write_to_buffer(d, MXPTAG ("!ELEMENT rdesc '<p>' FLAG=RoomDesc"), 0);
  410.     /* Get an item tag (for things on the ground) */
  411.     write_to_buffer(d, MXPTAG
  412.                     ("!ELEMENT Get "<send href='"
  413.                      "взять &#39;&name;&#39;|"
  414.                      "проверить &#39;&name;&#39;|"
  415.                      "пить &#39;&name;&#39;"
  416.                      "' "
  417.                      "hint='Для использования этого объекта нажмите правую кнопку мыши|"
  418.                      "Взять &desc;|"
  419.                      "Проверить &desc;|"
  420.                      "Пить из &desc;"
  421.                      "'>" ATT='name desc'"),
  422.                     0);
  423.     /* Drop an item tag (for things in the inventory) */
  424.     write_to_buffer(d, MXPTAG
  425.                     ("!ELEMENT Drop "<send href='"
  426.                      "бросить &#39;&name;&#39;|"
  427.                      "проверить &#39;&name;&#39;|"
  428.                      "смотреть в &#39;&name;&#39;|"
  429.                      "одеть &#39;&name;&#39;|"
  430.                      "есть &#39;&name;&#39;|"
  431.                      "пить &#39;&name;&#39;"
  432.                      "' "
  433.                      "hint='Для использования этого объекта нажмите правую кнопку мыши|"
  434.                      "Бросить &desc;|"
  435.                      "Проверить &desc;|"
  436.                      "Смотреть в &desc;|"
  437.                      "Одеть &desc;|"
  438.                      "Есть &desc;|"
  439.                      "Пить &desc;"
  440.                      "'>" ATT='name desc'"),
  441.                     0);
  442.     /* List an item tag (for things in a shop) */
  443.     write_to_buffer(d, MXPTAG
  444.                     ("!ELEMENT List "<send href='купить &#39;&name;&#39;' "
  445.                      "hint='Купить &desc;'>" "
  446.                      "ATT='name desc'"),
  447.                     0);
  448.     /* Player tag (for who lists, tells etc.) */
  449.     /*  write_to_buffer(d, MXPTAG
  450.      ("!ELEMENT Player "<send href='гов &#39;&name;&#39; ' "
  451.      "hint='Послать сообщение &name;' prompt>" "
  452.      "ATT='name'"),
  453.      0); */
  454. } /* end of turn_on_mxp */
  455.  
  456.  
  457. char *dns_gethostname(char *s)
  458. {
  459. #ifndef __CYGWIN32__
  460.     return gethostname_cached((unsigned char *)s, 4, FALSE);
  461. #else
  462.     return s;
  463. #endif
  464. }
  465.  
  466. void usage(const char *name)
  467. {
  468.     fprintf(stderr, "Usage:n");
  469.     fprintf(stderr, "  %s <options>nn", name);
  470.     fprintf(stderr, "    -p <portnum>   : start MUD on specified portn");
  471.     fprintf(stderr, "    -n             : start MUD in 'newlock' moden");
  472.     fprintf(stderr, "    -w             : start MUD in 'wizlock' noden");
  473.     fprintf(stderr, "    -l             : log all commands from playersn");
  474.     fprintf(stderr, "    -u             : do not use DBn");
  475.     fprintf(stderr, "    -P <db_port>   : MySQL port (default 3306)n");
  476.     fprintf(stderr, "    -N <db_name>   : MySQL database (default 'mud')n");
  477.     fprintf(stderr, "    -U <db_user>   : MySQL user (default 'mud')n");
  478.     fprintf(stderr, "    -S <db_passwd> : MySQL passwordn");
  479.     fprintf(stderr, "    -H <db_host>   : MySQL hostn");
  480.     fprintf(stderr, "    -f <cfg_file>  : config file (default '%s')n",
  481.             CONFIG_FILE);
  482.     fprintf(stderr, "NOTE: command line arguments are replace options definedn"
  483.             "      in config filen");
  484. }
  485.  
  486. void init_str(); /* db.c */
  487. //void init_lua(); /* lua/lua.c */
  488.  
  489. int main(int argc, char *argv[])
  490. {
  491.     struct timeval now_time;
  492. #ifndef WIN32
  493.     int control;
  494. #else
  495.     SOCKET control;
  496. #endif
  497.     char buf[MAX_INPUT_LENGTH];
  498.     struct mud_config conf;
  499.     int ch;
  500.     char *conf_file = NULL;
  501.  
  502. #if !defined(ONEUSER)
  503.     FILE        *fp = NULL;
  504.     extern      int max_ever;
  505. #endif
  506.  
  507.     /*
  508.      * Memory debugging if needed.
  509.      */
  510. #if defined(MALLOC_DEBUG)
  511.     malloc_debug(2);
  512. #endif
  513.  
  514.     setlocale(LC_ALL, "ru");
  515.     /*
  516.      * Init time.
  517.      */
  518.     gettimeofday(&now_time, NULL);
  519.     current_time        = (time_t) now_time.tv_sec;
  520.     boot_time           = current_time;
  521.  
  522.     /*
  523.      * Reserve one channel for our use.
  524.      */
  525.     if ((fpReserve = fopen(NULL_FILE, "r")) == NULL)
  526.     {
  527.         _perror(NULL_FILE);
  528.         exit(1);
  529.     }
  530.  
  531.     /* Set top_string */
  532.     init_str();
  533.  
  534.     /*
  535.      * Parse command line arguments and config file.
  536.      */
  537.     conf.port = 0;
  538.     conf.newlock = FALSE;
  539.     conf.wizlock = FALSE;
  540.     conf.log_all = FALSE;
  541.     conf.use_db  = TRUE;
  542.     conf.db_port = 0;
  543.     conf.db_host = NULL;
  544.     conf.db_name = NULL;
  545.     conf.db_user = NULL;
  546.     conf.db_passwd = NULL;
  547.  
  548.     while ((ch = getopt(argc, argv, "p:nwlf:P:H:N:U:S:")) != -1)
  549.     {
  550.         switch (ch)
  551.         {
  552.         case 'p':
  553.             if (!is_number(optarg))
  554.             {
  555.                 usage(argv[0]);
  556.                 exit(2);
  557.             }
  558.             else
  559.                 conf.port = atoi(optarg);
  560.             break;
  561.  
  562.         case 'n':
  563.             conf.newlock = TRUE;
  564.             break;
  565.  
  566.         case 'w':
  567.             conf.wizlock = TRUE;
  568.             break;
  569.  
  570.         case 'l':
  571.             conf.log_all = TRUE;
  572.             break;
  573.  
  574.         case 'f':
  575.             conf_file = str_dup(optarg);
  576.             break;
  577.  
  578.         case 'u':
  579.             conf.use_db = FALSE;
  580.             break;
  581.  
  582.         case 'P':
  583.             if (!is_number(optarg))
  584.             {
  585.                 usage(argv[0]);
  586.                 exit(2);
  587.             }
  588.             else
  589.                 conf.db_port = atoi(optarg);
  590.             break;
  591.  
  592.         case 'H':
  593.             conf.db_host = str_dup(optarg);
  594.             break;
  595.  
  596.         case 'N':
  597.             conf.db_name = str_dup(optarg);
  598.             break;
  599.  
  600.         case 'U':
  601.             conf.db_user = str_dup(optarg);
  602.             break;
  603.  
  604.         case 'S':
  605.             conf.db_passwd = str_dup(optarg);
  606.             break;
  607.  
  608.         case 'h':
  609.         case '?':
  610.         default:
  611.             usage(argv[0]);
  612.             exit(2);
  613.         }
  614.     }
  615.  
  616.     argc -= optind;
  617.     argv += optind;
  618.  
  619.     read_config(conf_file);
  620.     free_string(conf_file);
  621.  
  622.     if (conf.port)
  623.         cfg.port = conf.port;
  624.  
  625.     if (conf.newlock)
  626.         cfg.newlock = conf.newlock;
  627.  
  628.     if (conf.wizlock)
  629.         cfg.wizlock = conf.wizlock;
  630.  
  631.     if (conf.log_all)
  632.         cfg.log_all = conf.log_all;
  633.  
  634.     if (!conf.use_db)
  635.         cfg.use_db = conf.use_db;
  636.  
  637.     if (conf.db_port)
  638.         cfg.db_port = conf.db_port;
  639.  
  640.     if (conf.db_host)
  641.     {
  642.         free_string(cfg.db_host);
  643.         cfg.db_host = conf.db_host;
  644.     }
  645.  
  646.     if (conf.db_name)
  647.     {
  648.         free_string(cfg.db_name);
  649.         cfg.db_name = conf.db_name;
  650.     }
  651.  
  652.     if (conf.db_user)
  653.     {
  654.         free_string(cfg.db_user);
  655.         cfg.db_user = conf.db_user;
  656.     }
  657.  
  658.     if (conf.db_passwd)
  659.     {
  660.         free_string(cfg.db_passwd);
  661.         cfg.db_passwd = conf.db_passwd;
  662.     }
  663.  
  664. #if !defined(__CYGWIN32__)
  665.  
  666.     /* Signal handler initialization */
  667.     init_signals();
  668.  
  669.     /* Write PID to file */
  670.     sprintf(buf, "rom.%d", cfg.port);
  671.  
  672.     if ((fp = fopen(buf, "w")) == NULL)
  673.         bugf("Unable to open PID file.");
  674.     else
  675.     {
  676.         fprintf(fp, "%d", getpid());
  677.         fclose(fp);
  678.     }
  679.  
  680.     init_aspell();
  681. #ifndef linux
  682.     rdns_cache_set_ttl(12*60*60);       // twelve hours is moooore than enough
  683. #endif /* linux */
  684. #endif /* __CYGWIN32__ */
  685.  
  686. #if !defined(ONEUSER)
  687.     if ((fp = fopen(MAX_EVER_FILE, "r")) == NULL)
  688.         bugf("Unable to open MAX file.");
  689.     else
  690.     {
  691.         max_ever = fread_number(fp);
  692.         fclose(fp);
  693.     }
  694. #endif /* ONEUSER */
  695.  
  696.     /*
  697.      * Run the game.
  698.      */
  699.  
  700. //    init_lua();
  701.  
  702. #ifdef WIN32
  703.     {
  704.         unsigned short ws_vers = MAKEWORD(1, 1);
  705.         WSADATA wsadata;
  706.         int err;
  707.  
  708.         if ((err = WSAStartup(ws_vers, &wsadata)) != 0)
  709.         {
  710.             fprintf(stderr, "Can't init WinSocksn");
  711.             exit(1);
  712.         }
  713.     }
  714. #endif
  715.  
  716.     control = init_socket(cfg.port);
  717.  
  718.     boot_db();
  719.  
  720.     auctions[0].valid = auctions[1].valid = auctions[2].valid = FALSE;
  721.     sprintf(buf, "Balderdash is ready to rock on port %d at %s.", cfg.port, ctime(&boot_time));
  722.     log_string(buf);
  723.  
  724.     game_loop_unix(control);
  725. #ifndef WIN32
  726.     close(control);
  727. #else
  728.     closesocket(control);
  729.     WSACleanup();
  730. #endif
  731.  
  732.     /*
  733.      * That's all, folks.
  734.      */
  735.     log_string("Normal termination of game.");
  736.     exit(0);
  737.     return 0;
  738. }
  739.  
  740. #ifdef WIN32
  741. SOCKET
  742. #else
  743. int
  744. #endif
  745. init_socket(int port)
  746. {
  747.     static struct sockaddr_in sa_zero;
  748.     struct sockaddr_in sa;
  749. #ifndef WIN32
  750.     int x = 1;
  751.     int fd;
  752. #else
  753.     SOCKET fd;
  754. #endif
  755.  
  756.     if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  757.     {
  758.         _perror("Init_socket: socket");
  759.         exit(1);
  760.     }
  761.  
  762. #ifndef WIN32
  763.     if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
  764.                    (char *) &x, sizeof(x)) < 0)
  765.     {
  766.         _perror("Init_socket: SO_REUSEADDR");
  767.         close(fd);
  768.         exit(1);
  769.     }
  770. #endif
  771.  
  772. #if defined(SO_DONTLINGER) && !defined(SYSV) && !defined(WIN32)
  773.     {
  774.         struct  linger  ld;
  775.  
  776.         ld.l_onoff  = 1;
  777.         ld.l_linger = 1000;
  778.  
  779.         if (setsockopt(fd, SOL_SOCKET, SO_DONTLINGER,
  780.                        (char *) &ld, sizeof(ld)) < 0)
  781.         {
  782.             _perror("Init_socket: SO_DONTLINGER");
  783. #ifndef WIN32
  784.             close(fd);
  785. #else
  786.             closesocket(fd);
  787. #endif
  788.             exit(1);
  789.         }
  790.     }
  791. #endif
  792.  
  793.     sa              = sa_zero;
  794.     sa.sin_family   = AF_INET;
  795.     sa.sin_port     = htons(port);
  796.  
  797.     if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) < 0)
  798.     {
  799.         _perror("Init socket: bind");
  800. #ifndef WIN32
  801.         close(fd);
  802. #else
  803.         closesocket(fd);
  804. #endif
  805.         exit(1);
  806.     }
  807.  
  808.  
  809.     if (listen(fd, 3) < 0)
  810.     {
  811.         _perror("Init socket: listen");
  812. #ifndef WIN32
  813.         close(fd);
  814. #else
  815.         closesocket(fd);
  816. #endif
  817.         exit(1);
  818.     }
  819.  
  820.     return fd;
  821. }
  822.  
  823. #ifndef WIN32
  824. void game_loop_unix(int control)
  825. #else
  826. void game_loop_unix(SOCKET control)
  827. #endif
  828. {
  829.     static struct timeval null_time;
  830.     struct timeval last_time;
  831.  
  832. #if !defined(NOLIMIT) && defined(ONEUSER)
  833.     int count_desc = 0;   
  834. #endif
  835.  
  836. #ifndef WIN32
  837.     signal(SIGPIPE, SIG_IGN);
  838. #endif
  839.     gettimeofday(&last_time, NULL);
  840.     current_time = (time_t) last_time.tv_sec;
  841.  
  842.     /* Main loop */
  843.  
  844.     while (!merc_down)
  845.     {
  846.         fd_set in_set;
  847.         fd_set out_set;
  848.         fd_set exc_set;
  849.         DESCRIPTOR_DATA *d, *d_next;
  850.         int maxdesc;
  851. #ifndef WIN32
  852.         int cp_state;
  853.         char buf[MSL];
  854. #endif
  855.  
  856. #if defined(MALLOC_DEBUG)
  857.         if (malloc_verify() != 1)
  858.             abort();
  859. #endif
  860.  
  861.         /*
  862.          * Poll all active descriptors.
  863.          */
  864.         FD_ZERO(&in_set );
  865.         FD_ZERO(&out_set);
  866.         FD_ZERO(&exc_set);
  867.         FD_SET(control, &in_set);
  868.         maxdesc = control;
  869.         SLIST_FOREACH(d, &descriptor_list, link)
  870.         {
  871.             maxdesc = UMAX(maxdesc, d->descriptor);
  872.             FD_SET(d->descriptor, &in_set );
  873.             FD_SET(d->descriptor, &out_set);
  874.             FD_SET(d->descriptor, &exc_set);
  875.         }
  876.  
  877.         if (select(maxdesc+1, &in_set, &out_set, &exc_set, &null_time) < 0)
  878.         {
  879.             _perror("Game_loop: select: poll");
  880.             exit(1);
  881.         }
  882.  
  883.         /*
  884.          * New connection?
  885.          */
  886.  
  887.  
  888.         if (FD_ISSET(control, &in_set))
  889.             init_descriptor(control);
  890.  
  891.         /*
  892.          * Kick out the freaky folks.
  893.          */
  894.         SLIST_FOREACH_SAFE(d, &descriptor_list, link, d_next)
  895.         {
  896.             if (FD_ISSET(d->descriptor, &exc_set))
  897.             {
  898.                 FD_CLR(d->descriptor, &in_set );
  899.                 FD_CLR(d->descriptor, &out_set);
  900.                 if (d->character && d->connected == CON_PLAYING)
  901.                 {
  902.                     CHAR_DATA *ch = CH(d);
  903.  
  904.                     VALIDATE(ch);
  905.                     save_char_obj(ch, FALSE);
  906.                 }
  907.                 d->outtop       = 0;
  908.                 close_socket(d);
  909.                 continue;
  910.             }
  911.             /*  Kick out idling players */
  912.  
  913.             ++d->idle_tics;
  914.  
  915.             if (((d->connected == CON_GET_OLD_PASSWORD || d->connected == CON_GET_NAME || d->connected == CON_GET_CODEPAGE || d->connected == CON_GET_NUM_REGANSWER) && d->idle_tics > 300)
  916.                 || (d->connected != CON_PLAYING && d->idle_tics > 5000))
  917.             {
  918.                 write_to_descriptor(d, "rnTimed out... goodbye.rn", 0);
  919.                 close_socket(d);
  920.                 continue;
  921.             }
  922.  
  923. #if !defined(__CYGWIN32__)
  924.             /*  Kick out players from anonymous proxy*/
  925.             if ((cp_state = cp_get_state(inet_addr(d->ip))))
  926.             {
  927.                 if (d->character && d->connected == CON_PLAYING)
  928.                 {
  929.                     CHAR_DATA *ch = CH(d);
  930.  
  931.                     VALIDATE(ch);
  932.                     save_char_obj(ch, FALSE);
  933.                 }
  934.  
  935.                 switch (cp_state)
  936.                 {
  937.                 case CP_IS_SOCKS4:
  938.                     write_to_descriptor(d, "Anyonymous SOCKS4 proxy is not allowed!nr", 0);
  939.                     break;
  940.                 case CP_IS_SOCKS5:
  941.                     write_to_descriptor(d, "Anyonymous SOCKS5 proxy is not allowed!nr", 0);
  942.                     break;
  943.                 case CP_IS_HTTP:
  944.                     write_to_descriptor(d, "Anyonymous HTTP proxy is not allowed!nr", 0);
  945.                     break;
  946.                 case CP_IS_WHOIS:
  947.                     sprintf(buf, "Your country (%s) is not allowed!nr", cp_get_country(inet_addr(d->ip)));
  948.                     write_to_descriptor(d, buf, 0);
  949.                     break;
  950.                 default:
  951.                     break;
  952.                 }    
  953.  
  954.                 d->outtop       = 0;
  955.                 close_socket(d);
  956.             }
  957. #endif
  958.         }
  959.  
  960.         /*
  961.          * Process input.
  962.          */
  963.  
  964. #if !defined(NOLIMIT) && defined(ONEUSER)
  965.         count_desc = 0;
  966. #endif
  967.         SLIST_FOREACH_SAFE(d, &descriptor_list, link, d_next)
  968.         {
  969.             d->fcommand = FALSE;
  970.  
  971. #if !defined(NOLIMIT) && defined(ONEUSER)
  972.             if (++count_desc > 3)
  973.                 break;
  974. #endif
  975.  
  976.             if (FD_ISSET(d->descriptor, &in_set))
  977.             {
  978.                 if (d->character != NULL)
  979.                     d->character->timer = 0;
  980.  
  981.                 d->idle_tics = 0;
  982.  
  983.                 if (!read_from_descriptor(d))
  984.                 {
  985.                     FD_CLR(d->descriptor, &out_set);
  986.                     if (d->character != NULL && d->connected == CON_PLAYING)
  987.                     {
  988.                         CHAR_DATA *ch = CH(d);
  989.  
  990.                         VALIDATE(ch);
  991.                         save_char_obj(ch, FALSE);
  992.                     }
  993.                     d->outtop   = 0;
  994.                     close_socket(d);
  995.                     continue;
  996.                 }
  997.             }
  998.  
  999.             if (d->character != NULL && d->character->daze > 0)
  1000.                 --d->character->daze;
  1001.  
  1002.             if (d->character != NULL && d->character->wait > 0)
  1003.             {
  1004.                 --d->character->wait;
  1005.                 continue;
  1006.             }
  1007.  
  1008.             read_from_buffer(d);
  1009.  
  1010.             if (d->incomm[0] != '')
  1011.             {
  1012.                 d->fcommand     = TRUE;
  1013.                 stop_idling(d->character);
  1014.                 /* OLC */
  1015.                 if (d->showstr_point)
  1016.                     show_string(d, d->incomm);
  1017.                 else
  1018.                     if (d->pString)
  1019.                         string_add(d->character, d->incomm);
  1020.                     else
  1021.                         switch (d->connected)
  1022.                         {
  1023.                         case CON_PLAYING:
  1024.                             if (!run_olc_editor(d))
  1025.                                 substitute_alias(d, d->incomm);
  1026.                             break;
  1027.                         default:
  1028.                             nanny(d, d->incomm);
  1029.                             break;
  1030.                         }
  1031.  
  1032.                 d->incomm[0]    = '';
  1033.             }
  1034.         }
  1035.  
  1036.  
  1037.  
  1038.         /*
  1039.          * Autonomous game motion.
  1040.          */
  1041.         update_handler();
  1042.  
  1043.         /*
  1044.          * Output.
  1045.          */
  1046.         SLIST_FOREACH_SAFE(d, &descriptor_list, link, d_next)
  1047.         {
  1048.             if ((d->fcommand || d->outtop > 0 || d->out_compress)
  1049.                 && FD_ISSET(d->descriptor, &out_set))
  1050.             {
  1051.                 bool ok = TRUE;
  1052.  
  1053.                 if (d->fcommand || d->outtop > 0)
  1054.                     ok = process_output(d, TRUE);
  1055.  
  1056.                 if (ok && d->out_compress)
  1057.                     ok = processCompressed(d);
  1058.  
  1059.                 if (!ok)
  1060.                 {
  1061.                     if (d->character != NULL && d->connected == CON_PLAYING)
  1062.                     {
  1063.                         CHAR_DATA *ch = CH(d);
  1064.  
  1065.                         VALIDATE(ch);
  1066.                         save_char_obj(ch, FALSE);
  1067.                     }
  1068.                     d->outtop   = 0;
  1069.                     close_socket(d);
  1070.                 }
  1071.             }
  1072.         }
  1073.  
  1074.  
  1075.  
  1076.         /*
  1077.          * Synchronize to a clock.
  1078.          * Sleep(last_time + 1/PULSE_PER_SECOND - now).
  1079.          * Careful here of signed versus unsigned arithmetic.
  1080.          */
  1081.         {
  1082.             struct timeval now_time;
  1083.             long secDelta;
  1084.             long usecDelta;
  1085.  
  1086.             gettimeofday(&now_time, NULL);
  1087.             usecDelta   = ((int) last_time.tv_usec) - ((int) now_time.tv_usec)
  1088.                 + 1000000 / PULSE_PER_SECOND;
  1089.             secDelta    = ((int) last_time.tv_sec) - ((int) now_time.tv_sec);
  1090.             while (usecDelta < 0)
  1091.             {
  1092.                 usecDelta += 1000000;
  1093.                 secDelta  -= 1;
  1094.             }
  1095.  
  1096.             while (usecDelta >= 1000000)
  1097.             {
  1098.                 usecDelta -= 1000000;
  1099.                 secDelta  += 1;
  1100.             }
  1101.  
  1102.             if (secDelta > 0 || (secDelta == 0 && usecDelta > 0))
  1103.             {
  1104. #ifndef WIN32
  1105.                 struct timeval stall_time;
  1106.  
  1107.                 stall_time.tv_usec = usecDelta;
  1108.                 stall_time.tv_sec  = secDelta;
  1109.                 if (select(0, NULL, NULL, NULL, &stall_time) < 0)
  1110.                 {
  1111.                     _perror("Game_loop: select: stall");
  1112.                     exit(1);
  1113.                 }
  1114. #else
  1115.                 DWORD milli;
  1116.  
  1117.                 milli = secDelta * 1000 + usecDelta / 1000;
  1118.                 Sleep(milli);
  1119. #endif
  1120.             }
  1121.         }
  1122.  
  1123.         gettimeofday(&last_time, NULL);
  1124.         current_time = (time_t) last_time.tv_sec;
  1125.     }
  1126.  
  1127.     return;
  1128. }
  1129.  
  1130.  
  1131. #ifndef WIN32
  1132. void init_descriptor(int control)
  1133. #else
  1134. void init_descriptor(SOCKET control)
  1135. #endif
  1136. {
  1137.     DESCRIPTOR_DATA *dnew;
  1138.     struct sockaddr_in sock;
  1139.     /* #if defined(ONEUSER)
  1140.      struct hostent *from;
  1141. #endif  */
  1142.    unsigned int size;
  1143. #ifdef WIN32
  1144.     SOCKET desc;
  1145.     u_long arg = 1;
  1146. #else
  1147.     int desc;
  1148. #endif
  1149.  
  1150.     size = sizeof(sock);
  1151.     getsockname(control, (struct sockaddr *) &sock, &size);
  1152.     if ((desc = accept(control, (struct sockaddr *) &sock, &size)) < 0)
  1153.     {
  1154.         _perror("New_descriptor: accept");
  1155.         return;
  1156.     }
  1157.  
  1158.  
  1159. #if !defined(FNDELAY)
  1160. #define FNDELAY O_NDELAY
  1161. #endif
  1162.  
  1163. #ifdef WIN32
  1164.     if (ioctlsocket(desc, FIONBIO, &arg) == -1)
  1165. #else
  1166.         if (fcntl(desc, F_SETFL, FNDELAY) == -1)
  1167. #endif
  1168.         {
  1169.             _perror("New_descriptor: fcntl: FNDELAY");
  1170.             return;
  1171.         }
  1172.  
  1173.     /*
  1174.      * Cons a new descriptor.
  1175.      */
  1176.     dnew = new_descriptor();
  1177.  
  1178.     dnew->descriptor    = desc;
  1179.     dnew->connected     = CON_GET_CODEPAGE;
  1180.     dnew->showstr_head  = NULL;
  1181.     dnew->showstr_point = NULL;
  1182.     /*    dnew->outsize = 2000;*/ ;
  1183.     dnew->pEdit         = NULL;                 /* OLC */
  1184.     dnew->pString       = NULL;                 /* OLC */
  1185.     dnew->editor        = 0;                    /* OLC */
  1186.     dnew->outbuf[0]     = '';
  1187.     /*    dnew->outbuf  = alloc_mem(dnew->outsize); */
  1188.  
  1189.     dnew->idle_tics     = 0;
  1190.     dnew->codepage      = 0;
  1191.     dnew->mxp = FALSE;   /* NJG - initially MXP is off */
  1192.     dnew->mccp_version  = 0;
  1193.     dnew->grep[0]       = '';
  1194.  
  1195.     size = sizeof(sock);
  1196.     if (getpeername(desc, (struct sockaddr *) &sock, &size) < 0)
  1197.     {
  1198.         _perror("New_descriptor: getpeername");
  1199. #ifndef __CYGWIN32__
  1200.         bzero(dnew->Host, strlen(dnew->Host));
  1201. #else
  1202.         dnew->Host = str_dup("(unknown)");
  1203. #endif
  1204.         dnew->ip   = str_dup("(unknown)");
  1205.         dnew->sock = NULL;
  1206.     }
  1207.     else
  1208.     {
  1209.         /*
  1210.          * Would be nice to use inet_ntoa here but it takes a struct arg,
  1211.          * which ain't very compatible between gcc and system libraries.
  1212.          */
  1213.         unsigned long addr;
  1214.         char bfr[MAX_INPUT_LENGTH];
  1215.         char buf[MAX_STRING_LENGTH];
  1216. //      char new_buf[MAX_STRING_LENGTH];
  1217.  
  1218.         addr = ntohl(sock.sin_addr.s_addr);
  1219.  /*
  1220.         if ((addr < 1342177280 || addr > 3539992575) && (addr < 3556769792 || addr > 3590324223) && (addr < 1042350080 || addr > 1042415615) && (addr < 3644915712 || addr > 3644981247) && (addr < 3648389120 || addr > 3648454655) && (addr < 3641507840 || addr > 3641573375) && (addr < 3641180160 || addr > 3641245695) && (addr < 3645440000 || addr > 3645505535) && (addr < 3648323584 || addr > 3648389119) && (addr < 1299841024 || addr > 1299906559) && (addr < 3652124672 || addr > 3652190207) && (addr < 1299958272 || addr > 1299958527)  && (addr < 1294532608 || addr > 1294598143)  && (addr < 1306394624 || addr > 1306460159)  && (addr < 1052180480 || addr > 1052246015)  && (addr < 1333526528 || addr > 1333592063)  && (addr < 3644981248 || addr > 3645046783)  && (addr < 3645308928 || addr > 3645374463)  && (addr < 3641180160 || addr > 3641245695)  && (addr < 3650486272 || addr > 3650551807)  && (addr < 3642228736 || addr > 3642294271)  && (addr < 1047976704 || addr > 1047976959)  && (addr < 1310206208 || addr > 1311265535) && (addr < 1299958000 || addr > 1299958250) && (addr < 3650287104 || addr > 3650287359)  && (addr < 3653434100 || addr > 3653434370) && (addr <  1299959200|| addr >  1299959500) && (addr < 1333662000 || addr > 1333662300) && (addr < 1333667500 || addr > 1333668000) && (addr < 1314200000 || addr > 1314270435)  && (addr < 1299915000 || addr > 1299916000))
  1221.         {
  1222.                 sprintf(new_buf, "Your site has been blocked. Please, tell immortal Key (icq:55959409), and say this code: %lu .nr", addr);
  1223.                 write_to_descriptor_2(desc, new_buf, 0);
  1224. #ifndef WIN32
  1225.                 close(desc);
  1226. #else
  1227.                 closesocket(desc);
  1228. #endif
  1229.                 free_descriptor(dnew);
  1230.                 return;
  1231.     }
  1232.  
  1233.         if ((addr > 1536229376 && addr < 1536294911))
  1234.         {
  1235.                 sprintf(new_buf, "Your site has been blocked. Please, tell immortal Key (icq:55959409), and say this code: %lu .nr", addr);
  1236.                 write_to_descriptor_2(desc, new_buf, 0);
  1237. #ifndef WIN32
  1238.                 close(desc);
  1239. #else
  1240.                 closesocket(desc);
  1241. #endif
  1242.                 free_descriptor(dnew);
  1243.                 return;
  1244.     }
  1245. */
  1246.         sprintf(bfr, "%lu.%lu.%lu.%lu",
  1247.                 (addr >> 24) & 0xFF, (addr >> 16) & 0xFF,
  1248.                 (addr >>  8) & 0xFF, (addr      ) & 0xFF
  1249.                );
  1250.         sprintf(buf, "Sock.sinaddr:  %s", bfr);
  1251.         log_string(buf);
  1252.        
  1253. #if !defined(__CYGWIN32__) && !defined(NOTHREAD)
  1254.         memcpy(dnew->Host, &sock.sin_addr, sizeof(addr));
  1255.         gethostname_cached(dnew->Host, 4, TRUE);
  1256.         check_proxy(sock.sin_addr.s_addr);
  1257. #else
  1258.  
  1259.         /*      from = gethostbyaddr((char *) &sock.sin_addr,
  1260.          sizeof(sock.sin_addr), AF_INET);  */
  1261.         /*      dnew->Host = str_dup(from ? from->h_name : buf);   */
  1262.         dnew->Host = str_dup(bfr);
  1263. #endif
  1264.         dnew->ip = str_dup(bfr);
  1265.         dnew->sock = str_dup ((char *) &sock.sin_addr);
  1266.         /*              dnew->socksize = sizeof(sock.sin_addr); */
  1267.     }
  1268.  
  1269.     /*
  1270.      * Swiftest: I added the following to ban sites.  I don't
  1271.      * endorse banning of sites, but Copper has few descriptors now
  1272.      * and some people from certain sites keep abusing access by
  1273.      * using automated 'autodialers' and leaving connections hanging.
  1274.      *
  1275.      * Furey: added suffix check by request of Nickel of HiddenWorlds.
  1276.      */
  1277.     if (check_ban(dnew->ip, BAN_ALL))
  1278.     {
  1279.         write_to_descriptor_2(desc, "Your site has been banned from this mud.nr", 0);
  1280. #ifndef WIN32
  1281.         close(desc);
  1282. #else
  1283.         closesocket(desc);
  1284. #endif
  1285.         free_descriptor(dnew);
  1286.         return;
  1287.     }
  1288.     /*
  1289.      * Init descriptor data.
  1290.      */
  1291.     SLIST_INSERT_HEAD(&descriptor_list, dnew, link);
  1292.  
  1293.     /* Binary Connection */
  1294.  
  1295.     send(desc, telopt_binary, 3, 0);
  1296.  
  1297.     write_to_buffer(dnew, (char *)will_mxp_str,  -1);
  1298.     write_to_buffer(dnew, (char *)compress_will2, -1);
  1299.     write_to_buffer(dnew, (char *)compress_will, -1);
  1300.  
  1301.     /*
  1302.      * Send the greeting.
  1303.      */
  1304.  
  1305.     if (help_greeting)
  1306.     {
  1307.         if (help_greeting[0] == '.')
  1308.             write_to_buffer(dnew, help_greeting+1, 0);
  1309.         else
  1310.             write_to_buffer(dnew, help_greeting  , 0);
  1311.     }
  1312.  
  1313.     return;
  1314. }
  1315.  
  1316.  
  1317. void close_socket(DESCRIPTOR_DATA *dclose)
  1318. {
  1319.     CHAR_DATA *ch;
  1320.  
  1321.     if (dclose->outtop > 0)
  1322.         process_output(dclose, FALSE);
  1323.  
  1324.     if (dclose->snoop_by != NULL)
  1325.     {
  1326.         write_to_buffer(dclose->snoop_by, "Твоя цель вышла из игры.nr", 0);
  1327.     }
  1328.  
  1329.     {
  1330.         DESCRIPTOR_DATA *d;
  1331.  
  1332.         SLIST_FOREACH(d, &descriptor_list, link)
  1333.         {
  1334.             if (d->snoop_by == dclose)
  1335.                 d->snoop_by = NULL;
  1336.         }
  1337.     }
  1338.  
  1339.     if ((ch = dclose->character) != NULL)
  1340.     {
  1341.         char bfr[MAX_INPUT_LENGTH];
  1342.  
  1343.  
  1344.         sprintf(bfr, "Closing link to %s.", ch->name);
  1345.         log_string(bfr);
  1346.  
  1347.         if (ch->pet && ch->pet->in_room == NULL)
  1348.         {
  1349.             char_from_room(ch->pet);
  1350.             char_to_room(ch->pet, get_room_index(ROOM_VNUM_LIMBO), FALSE);
  1351.             extract_char(ch->pet, TRUE);
  1352.         }
  1353.  
  1354.         /* cut down on wiznet spam when rebooting */
  1355.  
  1356.         check_auctions(ch, NULL, "исчезновения владельца неизвестно куда");
  1357.  
  1358.         if (dclose->connected == CON_PLAYING && !merc_down)
  1359.         {
  1360.                 if (!IS_IMMORTAL(ch))
  1361.                 {                  
  1362.                     act("$n теряет сознание.", ch, NULL, NULL, TO_ROOM);
  1363.                 }
  1364.  
  1365.             edit_done(ch);      /* Снимаем флаг редактирования */
  1366.  
  1367.             sprintf(bfr, "[email protected]%s теряет связь.", dns_gethostname(dclose->Host));
  1368.             wiznet(bfr, ch, NULL, WIZ_LINKS, 0, get_trust(ch));
  1369.  
  1370.             if (ch->desc && ch->desc->original && !ch->desc->original->in_room)
  1371.                 ch->desc->original->in_room = ch->in_room;
  1372.  
  1373.             ch->desc = NULL;
  1374.         }
  1375.         else
  1376.         {        
  1377.             free_char(CH(dclose));
  1378.         }
  1379.     }
  1380.  
  1381.     SLIST_REMOVE(&descriptor_list, dclose, descriptor_data, link);
  1382.  
  1383.     if (dclose->out_compress)
  1384.     {
  1385.         deflateEnd(dclose->out_compress);
  1386.         free_mem(dclose->out_compress_buf, COMPRESS_BUF_SIZE);
  1387.         free_mem(dclose->out_compress, sizeof(z_stream));
  1388.     }
  1389.  
  1390. #ifndef WIN32
  1391.     close(dclose->descriptor);
  1392. #else
  1393.     closesocket(dclose->descriptor);
  1394. #endif
  1395.     free_descriptor(dclose);
  1396.     return;
  1397. }
  1398.  
  1399.  
  1400.  
  1401. bool read_from_descriptor(DESCRIPTOR_DATA *d)
  1402. {
  1403.     int iStart;
  1404.  
  1405.  
  1406.     /* Hold horses if pending command already. */
  1407.     if (d->incomm[0] != '')
  1408.         return TRUE;
  1409.  
  1410.     /* Check for overflow. */
  1411.     iStart = strlen(d->inbuf);
  1412.     if (iStart >= (int)(sizeof(d->inbuf) - 10))
  1413.     {
  1414.         char bfr[MAX_STRING_LENGTH];
  1415.  
  1416.         sprintf(bfr, "%s input overflow!", dns_gethostname(d->Host));
  1417.         log_string(bfr);
  1418.         write_to_buffer(d, "nr{R*** ЭТО СПАМ!!! ***{xnr", 0);
  1419.         return FALSE;
  1420.     }
  1421.  
  1422.     /* Snarf input. */
  1423.     for (; ;)
  1424.     {
  1425.         int nRead;
  1426.  
  1427.         nRead = recv(d->descriptor, d->inbuf + iStart, sizeof(d->inbuf) - 10 - iStart, 0);
  1428.         if (nRead > 0)
  1429.         {
  1430.             iStart += nRead;
  1431.             if (d->inbuf[iStart-1] == 'n' || d->inbuf[iStart-1] == 'r')
  1432.                 break;
  1433.         }
  1434.         else if (nRead == 0)
  1435.         {
  1436.             log_string("EOF encountered on read.");
  1437.             return FALSE;
  1438.         }
  1439. #ifndef WIN32
  1440.         else if (errno == EWOULDBLOCK)
  1441. #else
  1442.         else if (WSAGetLastError() == WSAEWOULDBLOCK)
  1443. #endif
  1444.             break;
  1445.         else
  1446.         {
  1447.             _perror("Read_from_descriptor");
  1448.             return FALSE;
  1449.         }
  1450.     }
  1451.  
  1452.     d->inbuf[iStart] = '';
  1453.  
  1454.     return TRUE;
  1455. }
  1456.  
  1457.  
  1458. int cmd_lookup(CHAR_DATA *ch, char *command);
  1459.  
  1460. /*
  1461.  * Transfer one line from input buffer to input line.
  1462.  */
  1463. void read_from_buffer(DESCRIPTOR_DATA *d)
  1464. {
  1465.     char bfr[MAX_STRING_LENGTH];
  1466.     int i, j, k;
  1467.     bool flag = TRUE;
  1468.     CHAR_DATA *ch;
  1469.  
  1470.  
  1471.     d->grep[0] = '';
  1472.  
  1473.     /* Очистка буфера команд */
  1474.  
  1475.     for (i = 0; d->inbuf[i] != ''; i++)
  1476.     {
  1477.         if (flag && d->inbuf[i] == '-')
  1478.         {
  1479.             d->inbuf[0] = '';
  1480.             write_to_buffer(d, "Буфер команд очищен.nr", 0);
  1481.             return;
  1482.         }
  1483.  
  1484.         flag = FALSE;
  1485.  
  1486.         if (d->inbuf[i] == 'n' || d->inbuf[i] == 'r')
  1487.             flag = TRUE;
  1488.     }
  1489.  
  1490.     /*
  1491.      * Hold horses if pending command already.
  1492.      */
  1493.     if (d->incomm[0] != '')
  1494.         return;
  1495.  
  1496.  
  1497.     /*
  1498.      * Look for at least one new line.
  1499.      */
  1500.  
  1501.     for (i = 0; d->inbuf[i] != 'n' && d->inbuf[i] != 'r'; i++)
  1502.         if (d->inbuf[i] == '')
  1503.             return;
  1504.  
  1505.     /*
  1506.      * Canonical input processing.
  1507.      */
  1508.     /* if (d->inbuf[0] != '')
  1509.      {
  1510.      log_string("INBUF");
  1511.      log_string(d->inbuf);
  1512.      }  */
  1513.  
  1514.     for (i = 0, k = 0; d->inbuf[i] != 'n' && d->inbuf[i] != 'r'; i++)
  1515.     {
  1516.         if (k >= MAX_INPUT_LENGTH - 2)
  1517.         {
  1518.             write_to_buffer(d, "Слишком длинная строка.nr", 0);
  1519.  
  1520.             /* skip the rest of the line */
  1521.             for (; d->inbuf[i] != ''; i++)
  1522.             {
  1523.                 if (d->inbuf[i] == 'n' || d->inbuf[i] == 'r')
  1524.                     break;
  1525.             }
  1526.             d->inbuf[i]   = 'n';
  1527.             d->inbuf[i+1] = '';
  1528.  
  1529.             break;
  1530.         }
  1531.  
  1532.         if (d->inbuf[i] == (signed char)IAC)
  1533.         {
  1534.             /*            log_string(d->ip);
  1535.              log_string(d->inbuf); */
  1536.             if (!memcmp(&d->inbuf[i], compress_do, strlen((char *)compress_do)))
  1537.             {
  1538.                 compressStart(d, FALSE);
  1539.                 i += strlen((char *)compress_do) - 1;
  1540.                 continue;
  1541.             }
  1542.             if (!memcmp(&d->inbuf[i], compress_do2, strlen((char *)compress_do2)))
  1543.             {
  1544.                 compressStart(d, TRUE);
  1545.                 i += strlen((char *)compress_do2) - 1;
  1546.                 continue;
  1547.             }
  1548.             if (!memcmp(&d->inbuf[i], echo_do_str, strlen((char *)echo_do_str)))
  1549.             {
  1550.                 i += strlen((char *)echo_do_str) - 1;
  1551.                 continue;
  1552.             }
  1553.             if (!memcmp(&d->inbuf[i], echo_dont_str, strlen((char *)echo_dont_str)))
  1554.             {
  1555.                 i += strlen((char *)echo_dont_str) - 1;
  1556.                 continue;
  1557.             }
  1558.             else if (!memcmp(&d->inbuf[i], compress_dont, strlen((char *)compress_dont)))
  1559.             {
  1560.                 if (d->mccp_version != 2)
  1561.                     compressEnd(d);
  1562.                 i += strlen((char *)compress_dont) - 1;
  1563.                 continue;
  1564.             }
  1565.             else if (!memcmp(&d->inbuf[i], compress_dont2,
  1566.                              strlen((char *)compress_dont2)))
  1567.             {
  1568.                 if (d->mccp_version != 1)
  1569.                     compressEnd(d);
  1570.  
  1571.                 i += strlen((char *)compress_dont2) - 1;
  1572.                 continue;
  1573.             }
  1574.             else if (!memcmp (&d->inbuf[i], do_mxp_str, strlen((char *)do_mxp_str)))
  1575.             {
  1576.                 turn_on_mxp (d);
  1577.                 /* remove string from input buffer */
  1578.                 i += strlen((char *)do_mxp_str) - 1;
  1579.                 continue;
  1580.             } /* end of turning on MXP */
  1581.             else  if (!memcmp (&d->inbuf[i], dont_mxp_str, strlen((char *)dont_mxp_str)))
  1582.             {
  1583.                 d->mxp = FALSE;
  1584.                 i += strlen((char *)dont_mxp_str) - 1;
  1585.                 continue;
  1586.             } /* end of turning off MXP */
  1587.             else if (d->codepage == 0)
  1588.             {
  1589.                 i++;
  1590.                 continue;
  1591.             }
  1592.         }
  1593.         else if (d->inbuf[i] == 'b' && k > 0)
  1594.         {
  1595.             --k;
  1596.             continue;
  1597.         }
  1598.  
  1599.         d->incomm[k++] = d->inbuf[i];
  1600.     }
  1601.  
  1602.     /*
  1603.      * Finish off the line.
  1604.      */
  1605.     if (k == 0)
  1606.         d->incomm[k++] = ' ';
  1607.     d->incomm[k] = '';
  1608.  
  1609.     //    log_string(d->incomm);
  1610.  
  1611.     /*
  1612.      * Deal with bozos with #repeat 1000 ...
  1613.      */
  1614.  
  1615.     if (k > 1 || d->incomm[0] == '!')
  1616.     {
  1617.         if (d->incomm[0] != '!' && strcmp(d->incomm, d->inlast))
  1618.         {
  1619.             d->repeat = 0;
  1620.         }
  1621.         else
  1622.         {
  1623.             one_argument(d->incomm, bfr);
  1624.  
  1625.             if (++d->repeat >= 25 && d->character
  1626.                 && d->connected == CON_PLAYING
  1627.                 && !is_name(bfr, "север юг запад восток верх вверх низ north "
  1628.                             "south east west up down новост news письм пись ново нов новости новос пис пи ид иде письмо"
  1629.                             "note изменения changes идея ideas конец quit изм из изме измен измене изменен изменени")
  1630.                 && !(IS_IMMORTAL(d->character)))
  1631.             {
  1632.                 sprintf(bfr, "%s input spamming!", dns_gethostname(d->Host));
  1633.                 log_string(bfr);
  1634.                 wiznet("$N замечен в спаме!", d->character, NULL,
  1635.                        WIZ_SPAM, 0, get_trust(d->character));
  1636.  
  1637.                 if (d->incomm[0] == '!')
  1638.                 {
  1639.                     convert_dollars(d->inlast);
  1640.                     wiznet(d->inlast, d->character, NULL, WIZ_SPAM, 0,
  1641.                            get_trust(d->character));
  1642.                 }
  1643.                 else
  1644.                 {
  1645.                     convert_dollars(d->incomm);
  1646.                     wiznet(d->incomm, d->character, NULL, WIZ_SPAM, 0,
  1647.                            get_trust(d->character));
  1648.                 }
  1649.  
  1650.                 d->repeat = 0;
  1651.  
  1652.                 write_to_buffer(d, "nr*** СПАМ НЕ РАЗРЕШЕН!!! ***nr", 0);
  1653.                 strcpy(d->incomm, "quit");
  1654.  
  1655.             }
  1656.         }
  1657.     }
  1658.  
  1659.     /*
  1660.      * Do '!' substitution.
  1661.      */
  1662.     if (d->incomm[0] == '!')
  1663.         strcpy(d->incomm, d->inlast);
  1664.     else
  1665.         strcpy(d->inlast, d->incomm);
  1666.  
  1667.     /*
  1668.      * Shift the input buffer.
  1669.      */
  1670.     while (d->inbuf[i] == 'n' || d->inbuf[i] == 'r')
  1671.         i++;
  1672.  
  1673.     for (j = 0; (d->inbuf[j] = d->inbuf[i+j]) != ''; j++)
  1674.         ;
  1675.  
  1676.     if (d->codepage > 0)
  1677.     {
  1678.         if (d->codepage == CODEPAGE_WIN)
  1679.         {
  1680.             for (i=0;d->incomm[i] != '';i++)
  1681.             {
  1682.                 if (d->incomm[i] == (signed char)IAC
  1683.                     && d->incomm[i + 1] == (signed char)IAC)
  1684.                 {
  1685.                     for (j= i + 1; d->incomm[j] != ''; j++)
  1686.                         d->incomm[j] = d->incomm[j + 1];
  1687.                 }
  1688.             }
  1689.         }
  1690.  
  1691.         if (d->codepage == CODEPAGE_TRANS)
  1692.         {
  1693.             if (d->connected == CON_PLAYING)
  1694.             {
  1695.                 char arg[MIL];
  1696.  
  1697.                 one_argument(d->incomm, arg);
  1698.  
  1699.                 log_string(arg);
  1700.  
  1701.                 if (cmd_lookup(d->character, arg) < 0)
  1702.                     recode(d->incomm, d->codepage, RECODE_INPUT);
  1703.             }
  1704.         }
  1705.         else
  1706.             recode(d->incomm, d->codepage, RECODE_INPUT);
  1707.  
  1708.         for (i=0;stoplist[i] != NULL && i < MAX_STOP_WORDS;i++)
  1709.         {
  1710.             if (!str_infix(stoplist[i], d->incomm))
  1711.             {
  1712.                 write_to_buffer(d, "ВЫБИРАЙ ВЫРАЖЕНИЯ!nrnr", 0);
  1713.                 sprintf(bfr, "Нецензурщина: '%s' Host: %s",
  1714.                         d->incomm, dns_gethostname(d->Host));
  1715.                 log_string(bfr);
  1716.                 sprintf(d->incomm, "nr");
  1717.                 return;
  1718.             }
  1719.         }
  1720.     }
  1721.  
  1722.     if (d->incomm[0] == ' ')
  1723.         return;
  1724.  
  1725.     if (d->connected == CON_PLAYING && (ch = CH(d)) != NULL && IS_SET(ch->act, PLR_LOG_OUTPUT))
  1726.     {
  1727.         char logname[50];
  1728.  
  1729.         sprintf(logname, "%s%s.out", LOG_DIR, ch->name);
  1730.         recode(logname, CODEPAGE_ALT, RECODE_OUTPUT|RECODE_NOANTITRIGGER);
  1731.  
  1732.         sprintf(bfr, " %sn", d->incomm);
  1733.  
  1734.         _log_string(bfr, logname);
  1735.     }
  1736.  
  1737.     if (d->editor == ED_NONE)
  1738.     {
  1739.         for (i = 1; d->incomm[i] != ''; i++)
  1740.         {
  1741.             if (d->incomm[i] == '|' && d->incomm[i - 1] != '\')
  1742.             {
  1743.                 int j;
  1744.  
  1745.                 strcpy(d->grep, d->incomm + i + 1);
  1746.                 d->incomm[i] = '';
  1747.  
  1748.                 for (i = 0; d->grep[i] == ' '; i++)
  1749.                     ;
  1750.  
  1751.                 if (i > 0)
  1752.                 {
  1753.                     for (j = 0; d->grep[j+i] != ''; j++)
  1754.                         d->grep[j] = d->grep[j+i];
  1755.  
  1756.                     d->grep[j] = '';
  1757.                     i = j - 1;
  1758.                 }
  1759.                 else
  1760.                     i = strlen(d->grep) - 1;
  1761.  
  1762.                 for (; d->grep[i] == ' '; i--)
  1763.                     d->grep[i] = '';
  1764.  
  1765.                 break;
  1766.             }
  1767.             else if (d->incomm[i - 1] == '\')
  1768.             {
  1769.                 /* strcpy() is safe here */
  1770.                 strcpy(&(d->incomm[i - 1]), &(d->incomm[i]));
  1771.             }
  1772.         }
  1773.     }
  1774.     return;
  1775. }
  1776.  
  1777.  
  1778.  
  1779. /*
  1780.  * Low level output function.
  1781.  */
  1782. bool process_output(DESCRIPTOR_DATA *d, bool fPrompt)
  1783. {
  1784.     extern bool merc_down;
  1785.     char buf[MAX_STRING_LENGTH];
  1786.     CHAR_DATA *ch;
  1787.  
  1788.  
  1789.     /*
  1790.      * Bust a prompt.
  1791.      * OLC changed
  1792.      */
  1793.     if (!merc_down)
  1794.     {
  1795.         if (fPrompt && d->showstr_point)
  1796.         {
  1797.             char tmp[MIL];
  1798.  
  1799.             colourconv(buf, "{Y[Нажмите Enter для продолжения]{xnr", d->character);
  1800.             strcpy(tmp, d->grep);
  1801.             d->grep[0] = '';
  1802.             write_to_buffer(d, buf, 0);
  1803.             strcpy(d->grep, tmp);
  1804.         }
  1805.         else if (fPrompt && d->pString && d->connected == CON_PLAYING)
  1806.             write_to_buffer(d, "> ", 2);
  1807.         else if (fPrompt && d->connected == CON_PLAYING)
  1808.         {
  1809.             if ((ch = d->character) != NULL)
  1810.             {
  1811.                 CHAR_DATA *victim;
  1812.  
  1813.                 d->grep[0] = '';
  1814.  
  1815.                 /* battle prompt */
  1816.                 if ((victim = ch->fighting) != NULL && can_see(ch, victim))
  1817.                 {
  1818.                     int percent;
  1819.                     char wound[100];
  1820.                     char buf[MAX_STRING_LENGTH];
  1821.                     char pbuff[MAX_STRING_LENGTH];
  1822.  
  1823.                     percent = (victim->max_hit > 0) ? victim->hit * 100 / victim->max_hit : -1;
  1824.  
  1825.                     if (percent >= 100)
  1826.                         sprintf(wound, "{Gв прекрасном состоянии.{x");
  1827.                     else if (percent >= 90)
  1828.                         sprintf(wound, "{gслегка поцарапан%s.{x", SEX_ENDING(victim));
  1829.                     else if (percent >= 75)
  1830.                         sprintf(wound, "{Cлегко ранен%s.{x", SEX_ENDING(victim));
  1831.                     else if (percent >= 50)
  1832.                         sprintf(wound, "{cранен%s.{x", SEX_ENDING(victim));
  1833.                     else if (percent >= 30)
  1834.                         sprintf(wound, "{Yсерьезно ранен%s.{x", SEX_ENDING(victim));
  1835.                     else if (percent >= 15)
  1836.                         sprintf(wound, "{yвыглядит очень плохо.{x");
  1837.                     else if (percent >= 0)
  1838.                         sprintf(wound, "{rв ужасном состоянии.{x");
  1839.                     else
  1840.                         sprintf(wound, "{Rистекает кровью.{x");
  1841.  
  1842.                     sprintf(pbuff, "%s %s nr",
  1843.                         IS_NPC(victim) ? victim->short_descr : victim->name, wound);
  1844.                     colourconv(buf, pbuff, ch);
  1845.                     buf[0] = UPPER(buf[0]);
  1846.                     write_to_buffer(d, buf, 0);
  1847.                 }
  1848.              
  1849.                 ch = CH(d);
  1850.                 if (!IS_SET(ch->comm, COMM_COMPACT))
  1851.                     write_to_buffer(d, "nr", 2);
  1852.  
  1853.                 if (IS_SET(ch->comm, COMM_PROMPT))
  1854.                     bust_a_prompt(d->character);
  1855.  
  1856.                 if (IS_SET(ch->comm, COMM_TELNET_GA))
  1857.                     write_to_buffer(d, (char *)go_ahead_str, -1);
  1858.             }
  1859.         }
  1860.     }
  1861.  
  1862.     /*
  1863.      * Short-circuit if nothing to write.
  1864.      */
  1865.     if (d->outtop == 0)
  1866.         return TRUE;
  1867.  
  1868.     /*
  1869.      * Snoop-o-rama.
  1870.      */
  1871.     if (d->snoop_by != NULL)
  1872.     {
  1873.         if (d->character != NULL)
  1874.             write_to_buffer(d->snoop_by, d->character->name, 0);
  1875.  
  1876.         write_to_buffer(d->snoop_by, "> ", 2);
  1877.         write_to_buffer(d->snoop_by, d->outbuf, d->outtop);
  1878.     }
  1879.  
  1880.     if (d->connected == CON_PLAYING && (ch = CH(d)) != NULL && IS_SET(ch->act, PLR_LOG_OUTPUT))
  1881.     {
  1882.         char logname[50];
  1883.         char tmp[OUTBUF_SIZE];
  1884.         int i, j;
  1885.  
  1886.         sprintf(logname, "%s%s.out", LOG_DIR, ch->name);
  1887.         recode(logname, CODEPAGE_ALT, RECODE_OUTPUT|RECODE_NOANTITRIGGER);
  1888.  
  1889.         for (i = 0, j = 0; i < d->outtop; i++)
  1890.             if (d->outbuf[i] != 'r')
  1891.                 tmp[j++] = d->outbuf[i];
  1892.  
  1893.         tmp[j] = '';
  1894.  
  1895.         _log_string(tmp, logname);
  1896.     }
  1897.  
  1898.     /*
  1899.      * OS-dependent output.
  1900.      */
  1901.     if (!write_to_descriptor(d, d->outbuf, d->outtop))
  1902.     {
  1903.         d->outtop = 0;
  1904.         return FALSE;
  1905.     }
  1906.     else
  1907.     {
  1908.         d->outtop = 0;
  1909.         return TRUE;
  1910.     }
  1911. }
  1912.  
  1913. /*
  1914.  * Bust a prompt (player settable prompt)
  1915.  * coded by Morgenes for Aldara Mud
  1916.  */
  1917. void bust_a_prompt(CHAR_DATA *ch)
  1918. {
  1919.     char buf[MAX_STRING_LENGTH];
  1920.     char buf2[MAX_STRING_LENGTH];
  1921.     char buf3[MAX_STRING_LENGTH];
  1922.     const char *str;
  1923.     const char *i;
  1924.     char *point;
  1925.     char *pbuff;
  1926.     char buffer[ MAX_STRING_LENGTH*2 ];
  1927.     char doors[MAX_INPUT_LENGTH];
  1928.     EXIT_DATA *pexit;
  1929.     bool found;
  1930.     const char *dir_name[] = {"N", "E", "S", "W", "U", "D"};
  1931.     const char *dir_rname[] = {"С", "В", "Ю", "З", "Вв", "Н"};
  1932.     int door;
  1933.  
  1934.     CHAR_DATA *victim;
  1935.     char wound[40];
  1936.     int percent;
  1937.  
  1938.     if (!ch || !ch->desc)
  1939.         return;
  1940.  
  1941.     /* reset MXP to default operation */
  1942.     if (ch->desc->mxp)
  1943.         write_to_buffer(ch->desc, ESC "[3z", 0);
  1944.  
  1945.     switch (ch->desc->editor)
  1946.     {
  1947.     case ED_AREA:
  1948.         sprintf(buf3, "<AEDIT:%s> ", olc_ed_vnum(ch));
  1949.         send_to_char(buf3, ch);
  1950.         break;
  1951.     case ED_ROOM:
  1952.         sprintf(buf3, "<REDIT:%s> ", olc_ed_vnum(ch));
  1953.         send_to_char(buf3, ch);
  1954.         break;
  1955.     case ED_OBJECT:
  1956.         sprintf(buf3, "<OEDIT:%s> ", olc_ed_vnum(ch));
  1957.         send_to_char(buf3, ch);
  1958.         break;
  1959.     case ED_MOBILE:
  1960.         sprintf(buf3, "<MEDIT:%s> ", olc_ed_vnum(ch));
  1961.         send_to_char(buf3, ch);
  1962.         break;
  1963.     case ED_MPCODE:
  1964.         sprintf(buf3, "<MPEDIT:%s> ", olc_ed_vnum(ch));
  1965.         send_to_char(buf3, ch);
  1966.         break;
  1967.     case ED_OPCODE:
  1968.         sprintf(buf3, "<OPEDIT:%s> ", olc_ed_vnum(ch));
  1969.         send_to_char(buf3, ch);
  1970.         break;
  1971.     case ED_RPCODE:
  1972.         sprintf(buf3, "<RPEDIT:%s> ", olc_ed_vnum(ch));
  1973.         send_to_char(buf3, ch);
  1974.         break;
  1975.     case ED_HELP:
  1976.         sprintf(buf3, "<HEDIT> ");
  1977.         send_to_char(buf3, ch);
  1978.         break;
  1979.     case ED_SKILL:
  1980.         sprintf(buf3, "<SKEDIT> ");
  1981.         send_to_char(buf3, ch);
  1982.         break;
  1983.     case ED_CLASS:
  1984.         sprintf(buf3, "<CLEDIT> ");
  1985.         send_to_char(buf3, ch);
  1986.         break;
  1987.     case ED_CHAT:
  1988.         sprintf(buf3, "<CEDIT:%s> ", olc_ed_vnum(ch));
  1989.         send_to_char(buf3, ch);
  1990.         break;
  1991.     case ED_RACE:
  1992.         printf_to_char("<RaEDIT:%s> ", ch, olc_ed_vnum(ch));
  1993.         break;
  1994.     case ED_GROUP:
  1995.         sprintf(buf3, "<GREDIT> ");
  1996.         send_to_char(buf3, ch);
  1997.         break;
  1998.  
  1999.     default:
  2000.         break;
  2001.     }
  2002.  
  2003.     point = buf;
  2004.     str = ch->prompt;
  2005.     if (str == NULL || str[0] == '')
  2006.     {
  2007.         sprintf(buf, "{c<%dhp %dm %dmv>{x %s ",
  2008.                 ch->hit, ch->mana, ch->move, ch->prefix);
  2009.         send_to_char(buf, ch);
  2010.         return;
  2011.     }
  2012.  
  2013.     if (IS_SET(ch->comm, COMM_AFK))
  2014.     {
  2015.         send_to_char("{c<ВОК>{x ", ch);
  2016.         return;
  2017.     }
  2018.  
  2019.     while(*str != '')
  2020.     {
  2021.         if(*str != '%')
  2022.         {
  2023.             *point++ = *str++;
  2024.             continue;
  2025.         }
  2026.         ++str;
  2027.         switch(*str)
  2028.         {
  2029.         default :
  2030.             i = " "; break;
  2031.  
  2032.  
  2033.         case 'T' :
  2034.             if (IS_IMMORTAL(ch))
  2035.             {
  2036.                 pbuff = ctime(&current_time);
  2037.                 pbuff+=4;
  2038.                 pbuff[strlen(pbuff)-6] = '';
  2039.             }
  2040.             else
  2041.                 pbuff="";
  2042.             i=pbuff;
  2043.             break;
  2044.  
  2045.         case 'b' :
  2046.  
  2047.             /*    this is the graphical battle damage prompt
  2048.              *
  2049.              *    <- Gothar 1997 ->
  2050.              */
  2051.  
  2052.             if ((victim = ch->fighting) != NULL && can_see(ch, victim))
  2053.             {
  2054.  
  2055.                 percent = (victim->max_hit > 0) ? victim->hit * 100 / victim->max_hit : -1;
  2056.  
  2057.                 if (percent >= 100)
  2058.                     sprintf(wound, "{c[{r###{Y###{g####{c]{x");
  2059.                 else if (percent >= 90)
  2060.                     sprintf(wound, "{c[{r###{Y###{g### {c]{x");
  2061.                 else if (percent >= 80)
  2062.                     sprintf(wound, "{c[{r###{Y###{g##  {c]{x");
  2063.                 else if (percent >= 70)
  2064.                     sprintf(wound, "{c[{r###{Y###{g#   {c]{x");
  2065.                 else if (percent >= 58)
  2066.                     sprintf(wound, "{c[{r###{Y###    {c]{x");
  2067.                 else if (percent >= 45)
  2068.                     sprintf(wound, "{c[{r###{Y##     {c]{x");
  2069.                 else if (percent >= 30)
  2070.                     sprintf(wound, "{c[{r###{Y#      {c]{x");
  2071.                 else if (percent >= 28)
  2072.                     sprintf(wound, "{c[{r###{x       {c]{x");
  2073.                 else if (percent >= 15)
  2074.                     sprintf(wound, "{c[{r##{x        {c]{x");
  2075.                 else if (percent >= 8)
  2076.                     sprintf(wound, "{c[{r#{x         {c]{x");
  2077.                 else
  2078.                     sprintf(wound, "{c[          {c]{x");
  2079.                 i = wound;
  2080.             }
  2081.             else
  2082.                 i = "";
  2083.             break;
  2084.         case '^' :
  2085.  
  2086.             /*    this is the percentage battle damage prompt
  2087.              *    The prompt changes colour to show the
  2088.              *    condition of the mob.
  2089.              *    <- Gothar 1997 ->
  2090.              */
  2091.             if (IS_IMMORTAL(ch) && (victim = ch->fighting) != NULL)
  2092.             {
  2093.                 percent = (victim->max_hit > 0) ? victim->hit * 100 / victim->max_hit : -1;
  2094.  
  2095.                 if(percent >= 65)
  2096.                     sprintf(buf2, "{c[{g%d%%{c]{x", percent);
  2097.                 else if(percent >= 25 && percent < 65)
  2098.                     sprintf(buf2, "{c[{Y%d%%{c]{x", percent);
  2099.                 else
  2100.                     sprintf(buf2, "{c[{r%d%%{c]{x", percent);
  2101.                 i = buf2;
  2102.             }
  2103.             else
  2104.                 i = "";
  2105.             break;
  2106.  
  2107.         case 'e':
  2108.         case 'E':
  2109.             doors[0] = '';
  2110.             found = FALSE;
  2111.             if (IS_AWAKE(ch))
  2112.             {
  2113.                 if (IS_AFFECTED(ch, AFF_BLIND)
  2114.                     && !IS_SET(ch->act, PLR_HOLYLIGHT))
  2115.                 {
  2116.                     found=TRUE;
  2117.                     strcpy(doors, (*str == 'e') ? "blind" : "слеп");
  2118.                 }
  2119.                 else if (ch->in_room)
  2120.                 {
  2121.                     if (!IS_NPC(ch)
  2122.                         && !IS_SET(ch->act, PLR_HOLYLIGHT)
  2123.                         && room_is_dark_new(ch))
  2124.                     {
  2125.                         found=TRUE;
  2126.                         strcpy(doors, (*str == 'e') ? "dark" : "темно");
  2127.                     }
  2128.                     else
  2129.                     {
  2130.                         for (door = 0; door < 6; door++)
  2131.                         {
  2132.                             if ((pexit = ch->in_room->exit[door]) != NULL
  2133.                                 && pexit->u1.to_room != NULL
  2134.                                 && (can_see_room(ch, pexit->u1.to_room)
  2135.                                     || IS_AFFECTED(ch, AFF_INFRARED))
  2136.                                 && !IS_AFFECTED(ch, AFF_BLIND)
  2137.                                 && !IS_SET(pexit->exit_info, EX_CLOSED))
  2138.                             {
  2139.                                 found = TRUE;
  2140.                                 strcat(doors, (*str == 'e') ? dir_name[door] : dir_rname[door]);
  2141.                             }
  2142.                         }
  2143.                     }
  2144.                 }
  2145.             }
  2146.             else
  2147.             {
  2148.                 strcpy(doors, (*str == 'e') ? "sleeping" : "сон");
  2149.                 found=TRUE;
  2150.             }
  2151.             if (!found)
  2152.                 strcpy(doors, (*str == 'e') ? "none" : "нет");
  2153.  
  2154.             strcpy(buf2, doors);
  2155.             i = buf2;
  2156.             break;
  2157.         case 'y' :
  2158.             sprintf(buf2, "%s", ch->style == NORM_STYLE ? "Норма"
  2159.                                 : (ch->style == AGGR_STYLE ? "Атака" : "Оборона"));
  2160.             i = buf2; break;
  2161.  
  2162. //бессмертие и посмертие
  2163.         case 'i' :
  2164.                 if (!IS_NPC(ch))
  2165.                 {
  2166.                         if (ch->pcdata->temp_RIP == 0)
  2167.                         {
  2168.                             sprintf(buf2, "%s", "нет");
  2169.                         }
  2170.                         else
  2171.                         {
  2172.                                 if (ch->pcdata->temp_RIP == 1)
  2173.                                 {
  2174.                                     sprintf(buf2, "%s", "выкл");
  2175.                                 }
  2176.                                 else
  2177.                                 {
  2178.                                         if (ch->pcdata->temp_RIP == 2)
  2179.                                         {
  2180.                                                 sprintf(buf2, "%s", "вкл");
  2181.                                         }
  2182.                                         else
  2183.                                         {
  2184.                                                 if (ch->pcdata->temp_RIP == 3)
  2185.                                                 {
  2186.                                                         sprintf(buf2, "%s", "посм");
  2187.                                                 }
  2188.                                         }
  2189.                                 }
  2190.                         }
  2191.                 }
  2192.                 else
  2193.                 {
  2194.                     sprintf(buf2, "%s", "неопознано");
  2195.                 }
  2196.                 i = buf2; break;
  2197.  
  2198.  
  2199.         case 'I' :
  2200.                 if (!IS_NPC(ch))
  2201.                 {
  2202.                         if (ch->pcdata->temp_RIP == 0)
  2203.                         {
  2204.                             sprintf(buf2, "%s", "не куплено");
  2205.                         }
  2206.                         else
  2207.                         {
  2208.                                 if (ch->pcdata->temp_RIP == 1)
  2209.                                 {
  2210.                                     sprintf(buf2, "%s", "бессмертие выключено");
  2211.                                 }
  2212.                                 else
  2213.                                 {
  2214.                                         if (ch->pcdata->temp_RIP == 2)
  2215.                                         {
  2216.                                                 sprintf(buf2, "%s", "бессмертие включено");
  2217.                                         }
  2218.                                         else
  2219.                                         {
  2220.                                                 if (ch->pcdata->temp_RIP == 3)
  2221.                                                 {
  2222.                                                         sprintf(buf2, "%s", "посмертие");
  2223.                                                 }
  2224.                                         }
  2225.                                 }
  2226.                         }
  2227.                 }
  2228.                 else
  2229.                 {
  2230.  
  2231.                     sprintf(buf2, "%s", "неопознано");
  2232.                 }
  2233.                 i = buf2; break;
  2234.  
  2235.  
  2236.  
  2237.         case 'c' :
  2238.             strcpy(buf2, "nr");
  2239.             i = buf2; break;
  2240.         case 'h' :
  2241.             sprintf(buf2, "%d", ch->hit);
  2242.             i = buf2; break;
  2243.         case 'H' :
  2244.             sprintf(buf2, "%d", ch->max_hit);
  2245.             i = buf2; break;
  2246.         case 'm' :
  2247.             sprintf(buf2, "%d", ch->mana);
  2248.             i = buf2; break;
  2249.         case 'M' :
  2250.             sprintf(buf2, "%d", ch->max_mana);
  2251.             i = buf2; break;
  2252.         case 'v' :
  2253.             sprintf(buf2, "%d", ch->move);
  2254.             i = buf2; break;
  2255.         case 'V' :
  2256.             sprintf(buf2, "%d", ch->max_move);
  2257.             i = buf2; break;
  2258.         case 'x' :
  2259.             sprintf(buf2, "%d", ch->exp);
  2260.             i = buf2; break;
  2261.         case 'X' :
  2262.             sprintf(buf2, "%d", TNL(ch));
  2263.             i = buf2; break;
  2264.         case 'g' :
  2265.             sprintf(buf2, "%ld", ch->gold);
  2266.             i = buf2; break;
  2267.         case 's' :
  2268.             sprintf(buf2, "%ld", ch->silver);
  2269.             i = buf2; break;
  2270.         case 'a' :
  2271.             if(ch->level > 9)
  2272.                 sprintf(buf2, "%d", ch->alignment);
  2273.             else if (ch->alignment >  900)
  2274.                 sprintf(buf2, "%s", "ангел");
  2275.             else if (ch->alignment >  700)
  2276.                 sprintf(buf2, "%s", "святая");
  2277.             else if (ch->alignment >  350)
  2278.                 sprintf(buf2, "%s", "хорошая");
  2279.             else if (ch->alignment >  100)
  2280.                 sprintf(buf2, "%s", "любезная");
  2281.             else if (ch->alignment > -100)
  2282.                 sprintf(buf2, "%s", "нейтральная");
  2283.             else if (ch->alignment > -350)
  2284.                 sprintf(buf2, "%s", "подлая");
  2285.             else if (ch->alignment > -700)
  2286.                 sprintf(buf2, "%s", "злая");
  2287.             else if (ch->alignment > -900)
  2288.                 sprintf(buf2, "%s", "демон");
  2289.             else
  2290.                 sprintf(buf2, "%s", "сатана");
  2291.  
  2292.             i = buf2;
  2293.             break;
  2294.         case 'r' :
  2295.             if(SUPPRESS_OUTPUT(check_blind(ch)) && ch->in_room != NULL && IS_AWAKE(ch) && can_see_room(ch, ch->in_room))
  2296.                 sprintf(buf2, "%s", room_is_dark_new(ch) ? "темно" : ch->in_room->name);
  2297.             else
  2298.                 strcpy(buf2, " ");
  2299.             i = buf2; break;
  2300.         case 'R' :
  2301.             if(IS_IMMORTAL(ch) && ch->in_room != NULL)
  2302.                 sprintf(buf2, "%d", ch->in_room->vnum);
  2303.             else
  2304.                 strcpy(buf2, " ");
  2305.             i = buf2; break;
  2306.         case 'z' :
  2307.             if(IS_IMMORTAL(ch) && ch->in_room != NULL)
  2308.                 sprintf(buf2, "%s", ch->in_room->area->name);
  2309.             else
  2310.                 sprintf(buf2, " ");
  2311.             i = buf2; break;
  2312.         case 't' :
  2313.             sprintf(buf2, "%d", time_info.hour);
  2314.             i = buf2; break;
  2315.         case '%' :
  2316.             strcpy(buf2, "%%");
  2317.             i = buf2; break;
  2318.         case 'o' :
  2319.             sprintf(buf2, "%s", olc_ed_name(ch));
  2320.             i = buf2; break;
  2321.         case 'O' :
  2322.             sprintf(buf2, "%s", olc_ed_vnum(ch));
  2323.             i = buf2; break;
  2324.             /*
  2325.              * Общее время и время до окончания квеста.
  2326.              */
  2327.         case 'q' :
  2328.             if (IS_NPC(ch))
  2329.                 buf2[0] = '';
  2330.             else if (IS_SET(ch->act, PLR_QUESTING))
  2331.                 sprintf(buf2, "%d", ch->pcdata->countdown);
  2332.             else if (ch->pcdata->nextquest)
  2333.                 sprintf(buf2, "%d tnq", ch->pcdata->nextquest);
  2334.             else
  2335.                 strcpy(buf2, " ");
  2336.             i = buf2;
  2337.             break;
  2338.         case 'Q' :
  2339.             if (IS_NPC(ch))
  2340.                 buf2[0] = '';
  2341.             else if (IS_SET(ch->act, PLR_QUESTING))
  2342.                 sprintf(buf2, "%d", ch->pcdata->qtime);
  2343.             else
  2344.                 strcpy(buf2, " ");
  2345.             i = buf2;
  2346.             break;
  2347.         case 'p' :
  2348.             if (IS_NPC(ch))
  2349.                 buf2[0] = '';
  2350.             else
  2351.                 sprintf(buf2, "%d", ch->pcdata->quest_curr);
  2352.             i = buf2;
  2353.             break;
  2354.         case 'P' :
  2355.             if (IS_NPC(ch))
  2356.                 buf2[0] = '';
  2357.             else
  2358.                 sprintf(buf2, "%d", ch->pcdata->quest_accum);
  2359.             i = buf2;
  2360.             break;
  2361.  
  2362.             /*
  2363.              * Погоду в промпт. Для вампиров и кастеров полезно.
  2364.              */
  2365.         case 'w' :
  2366.             if (IS_OUTSIDE(ch) && IS_AWAKE(ch))
  2367.             {
  2368.                 switch (weather_info.sky)
  2369.                 {
  2370.                 case SKY_CLOUDLESS:
  2371.                     sprintf(buf2, "{x[{Yбезоблачно{x]");
  2372.                     break;
  2373.                 case SKY_CLOUDY:
  2374.                     sprintf(buf2, "{x[{yоблачно{x]");
  2375.                     break;
  2376.                 case SKY_RAINING:
  2377.                     sprintf(buf2, "{x[{wидет дождь{x]");
  2378.                     break;
  2379.                 case SKY_LIGHTNING:
  2380.                     sprintf(buf2, "{x[{Dгроза{x]");
  2381.                     break;
  2382.                 default:
  2383.                     strcpy(buf2, " ");
  2384.                     break;
  2385.                 }
  2386.             }
  2387.             else
  2388.                 strcpy(buf2, " ");
  2389.             i = buf2; break;
  2390.         }
  2391.         ++str;
  2392.         while ((*point = *i) != '')
  2393.             ++point, ++i;
  2394.     }
  2395.  
  2396.     *point      = '';
  2397.     pbuff       = buffer;
  2398.     colourconv(pbuff, buf, ch);
  2399.     send_to_char("{c", ch);
  2400.     write_to_buffer(ch->desc, buffer, 0);
  2401.     send_to_char("{x", ch);
  2402.  
  2403.     if (ch->prefix[0] != '')
  2404.     {
  2405.         write_to_buffer(ch->desc, ch->prefix, 0);
  2406.         write_to_buffer(ch->desc, " ", 0);
  2407.     }
  2408.     return;
  2409. }
  2410.  
  2411. /*
  2412.  * Count number of mxp tags need converting
  2413.  *    ie. < becomes &lt;
  2414.  *        > becomes &gt;
  2415.  *        & becomes &amp;
  2416.  */
  2417.  
  2418. int count_mxp_tags (const int bMXP, const char *txt, int length)
  2419. {
  2420.     char c;
  2421.     const char * p;
  2422.     int count;
  2423.     int bInTag = FALSE;
  2424.     int bInEntity = FALSE;
  2425.  
  2426.     for (p = txt, count = 0;
  2427.          length > 0;
  2428.          p++, length--)
  2429.     {
  2430.         c = *p;
  2431.  
  2432.         if (bInTag)  /* in a tag, eg. <send> */
  2433.         {
  2434.             if (!bMXP)
  2435.                 count--;     /* not output if not MXP */
  2436.             if (c == MXP_ENDc)
  2437.                 bInTag = FALSE;
  2438.         } /* end of being inside a tag */
  2439.         else if (bInEntity)  /* in a tag, eg. <send> */
  2440.         {
  2441.             if (!bMXP)
  2442.                 count--;     /* not output if not MXP */
  2443.             if (c == ';')
  2444.                 bInEntity = FALSE;
  2445.         } /* end of being inside a tag */
  2446.         else switch (c)
  2447.         {
  2448.  
  2449.         case MXP_BEGc:
  2450.             bInTag = TRUE;
  2451.             if (!bMXP)
  2452.                 count--;     /* not output if not MXP */
  2453.             break;
  2454.  
  2455.         case MXP_ENDc:   /* shouldn't get this case */
  2456.             if (!bMXP)
  2457.                 count--;     /* not output if not MXP */
  2458.             break;
  2459.  
  2460.         case MXP_AMPc:
  2461.             bInEntity = TRUE;
  2462.             if (!bMXP)
  2463.                 count--;     /* not output if not MXP */
  2464.             break;
  2465.  
  2466.         default:
  2467.             if (bMXP)
  2468.             {
  2469.                 switch (c)
  2470.                 {
  2471.                 case '<':       /* < becomes &lt; */
  2472.                 case '>':       /* > becomes &gt; */
  2473.                     count += 3;
  2474.                     break;
  2475.  
  2476.                 case '&':
  2477.                     count += 4;    /* & becomes &amp; */
  2478.                     break;
  2479.  
  2480.                 case '"':        /* " becomes &quot; */
  2481.                     count += 5;
  2482.                     break;
  2483.  
  2484.                 } /* end of inner switch */
  2485.             }   /* end of MXP enabled */
  2486.         } /* end of switch on character */
  2487.  
  2488.     }   /* end of counting special characters */
  2489.  
  2490.     return count;
  2491. } /* end of count_mxp_tags */
  2492.  
  2493. void convert_mxp_tags (const int bMXP, char * dest, const char *src, int length)
  2494. {
  2495.     char c;
  2496.     const char * ps;
  2497.     char * pd;
  2498.     int bInTag = FALSE;
  2499.     int bInEntity = FALSE;
  2500.  
  2501.     for (ps = src, pd = dest;
  2502.          length > 0;
  2503.          ps++, length--)
  2504.     {
  2505.         c = *ps;
  2506.         if (bInTag)  /* in a tag, eg. <send> */
  2507.         {
  2508.             if (c == MXP_ENDc)
  2509.             {
  2510.                 bInTag = FALSE;
  2511.                 if (bMXP)
  2512.                     *pd++ = '>';
  2513.             }
  2514.             else if (bMXP)
  2515.                 *pd++ = c;  /* copy tag only in MXP mode */
  2516.         } /* end of being inside a tag */
  2517.         else if (bInEntity)  /* in a tag, eg. <send> */
  2518.         {
  2519.             if (bMXP)
  2520.                 *pd++ = c;  /* copy tag only in MXP mode */
  2521.             if (c == ';')
  2522.                 bInEntity = FALSE;
  2523.         } /* end of being inside a tag */
  2524.         else switch (c)
  2525.         {
  2526.         case MXP_BEGc:
  2527.             bInTag = TRUE;
  2528.             if (bMXP)
  2529.                 *pd++ = '<';
  2530.             break;
  2531.  
  2532.         case MXP_ENDc:    /* shouldn't get this case */
  2533.             if (bMXP)
  2534.                 *pd++ = '>';
  2535.             break;
  2536.  
  2537.         case MXP_AMPc:
  2538.             bInEntity = TRUE;
  2539.             if (bMXP)
  2540.                 *pd++ = '&';
  2541.             break;
  2542.  
  2543.         default:
  2544.             if (bMXP)
  2545.             {
  2546.                 switch (c)
  2547.                 {
  2548.                 case '<':
  2549.                     memcpy (pd, "&lt;", 4);
  2550.                     pd += 4;
  2551.                     break;
  2552.  
  2553.                 case '>':
  2554.                     memcpy (pd, "&gt;", 4);
  2555.                     pd += 4;
  2556.                     break;
  2557.  
  2558.                 case '&':
  2559.                     memcpy (pd, "&amp;", 5);
  2560.                     pd += 5;
  2561.                     break;
  2562.  
  2563.                 case '"':
  2564.                     memcpy (pd, "&quot;", 6);
  2565.                     pd += 6;
  2566.                     break;
  2567.  
  2568.                 default:
  2569.                     *pd++ = c;
  2570.                     break;  /* end of default */
  2571.  
  2572.                 } /* end of inner switch */
  2573.             }
  2574.             else
  2575.                 *pd++ = c;  /* not MXP - just copy character */
  2576.             break;
  2577.  
  2578.         } /* end of switch on character */
  2579.  
  2580.     }   /* end of converting special characters */
  2581. } /* end of convert_mxp_tags */
  2582.  
  2583.  
  2584. /*
  2585.  * Append onto an output buffer.
  2586.  */
  2587. void write_to_buffer(DESCRIPTOR_DATA *d, const char *txt, int length)
  2588. {
  2589.     int origlength;
  2590.     char buf[OUTBUF_SIZE];
  2591.  
  2592.     buf[0] = '';
  2593.  
  2594.     if (!Show_output)
  2595.         return;
  2596.  
  2597.     if (!IS_NULLSTR(d->grep))
  2598.     {
  2599.         int i, j = 0;
  2600.         char tmp[OUTBUF_SIZE];
  2601.  
  2602.         for (i = 0; ; i++)
  2603.         {
  2604.             tmp[j++] = txt[i];
  2605.  
  2606.             if (txt[i] == 'n' || txt[i] == 'r' || txt[i+1] == '')
  2607.             {
  2608.                 if (txt[i+1] == 'n' || txt[i+1] == 'r')
  2609.                     tmp[j++] = txt[++i];
  2610.  
  2611.                 tmp[j] = '';
  2612.  
  2613.                 if (!str_infix(d->grep, tmp))
  2614.                     strcat(buf, tmp);
  2615.  
  2616.                 if (txt[i+1] == '')
  2617.                     break;
  2618.  
  2619.                 j = 0;
  2620.             }
  2621.         }
  2622.  
  2623.         length = strlen(buf);
  2624.     }
  2625.     else
  2626.     {
  2627.         /*
  2628.          * Find length in case caller didn't.
  2629.          */
  2630.  
  2631.         if (length <= 0)
  2632.             length = strlen(txt);
  2633.  
  2634.         strcpy(buf, txt);
  2635.     }
  2636.     origlength = length;
  2637.  
  2638.     /* work out how much we need to expand/contract it */
  2639.     length += count_mxp_tags (d->mxp, buf, length);
  2640.  
  2641.     /*
  2642.      * Initial nr if needed.
  2643.      */
  2644.     if (d->outtop == 0 && !d->fcommand)
  2645.     {
  2646.         d->outbuf[0]    = 'n';
  2647.         d->outbuf[1]    = 'r';
  2648.         d->outtop       = 2;
  2649.     }
  2650.  
  2651.     /*
  2652.      * Expand the buffer as needed.
  2653.      */
  2654.     /*    while (d->outtop + length >= d->outsize)
  2655.      {
  2656.      char *outbuf; */
  2657.  
  2658.     if (/* d->outsize >= 32000 */ strlen(d->outbuf) + length >= OUTBUF_SIZE)
  2659.     {
  2660.         char buf[MSL];
  2661.  
  2662.         strlcpy(buf, d->character ? d->character->name : "(unknown)", MSL);
  2663.         d->outtop = 0;
  2664.         close_socket(d);
  2665.         bugf("Buffer overflow from char '%s'. Closing.", buf);
  2666.         return;
  2667.     }
  2668.     /*  outbuf      = alloc_mem(2 * d->outsize);
  2669.      strncpy(outbuf, d->outbuf, d->outtop);
  2670.      free_mem(d->outbuf, d->outsize);
  2671.      d->outbuf   = outbuf;
  2672.      d->outsize *= 2;
  2673.      }   */
  2674.  
  2675.     /*
  2676.      * Copy.
  2677.      */
  2678.     /* MXP remove:   strncpy(d->outbuf + d->outtop, txt, length); */
  2679.  
  2680.     convert_mxp_tags(d->mxp, d->outbuf + d->outtop, buf, origlength);
  2681.     d->outtop += length;
  2682.     return;
  2683. }
  2684.  
  2685.  
  2686.  
  2687. /*
  2688.  * Lowest level output function.
  2689.  * Write a block of text to the file descriptor.
  2690.  * If this gives errors on very long blocks (like 'ofind all'),
  2691.  *   try lowering the max block size.
  2692.  */
  2693. /*bool write_to_descriptor(DESCRIPTOR_DATA *d, char *txt, int length) */
  2694. #ifndef WIN32
  2695. bool write_to_descriptor_2(int d, char *txt, int length)
  2696. #else
  2697. bool write_to_descriptor_2(SOCKET d, char *txt, int length)
  2698. #endif
  2699. {
  2700.     int iStart;
  2701.     int nWrite;
  2702.     int nBlock;
  2703.  
  2704.     if (length <= 0)
  2705.         length = strlen(txt);
  2706.  
  2707.     for (iStart = 0; iStart < length; iStart += nWrite)
  2708.     {
  2709.         nBlock = UMIN(length - iStart, 4096);
  2710.         if ((nWrite = send(d, txt + iStart, nBlock, 0)) < 0)
  2711.         { _perror("Write_to_descriptor2"); return FALSE; }
  2712.     }
  2713.  
  2714.     return TRUE;
  2715. }
  2716.  
  2717. /* mccp: write_to_descriptor wrapper */
  2718. bool write_to_descriptor(DESCRIPTOR_DATA *d, char *txt, int length)
  2719. {
  2720.     int i;
  2721.     char buf[2*OUTBUF_SIZE];
  2722.     bool flag = TRUE;
  2723.  
  2724.     buf[0] = '';
  2725.  
  2726.     if (length < 0)
  2727.         flag = FALSE;
  2728.  
  2729.     if (length <= 0)
  2730.         length = strlen(txt);
  2731.  
  2732.     strncpy(buf, txt, length);
  2733.     buf[length]='';
  2734.  
  2735.     if (flag && d->codepage > 0)
  2736.     {
  2737.         length += recode(buf, d->codepage, IS_IMMORTAL(CH(d)) ? RECODE_OUTPUT|RECODE_NOANTITRIGGER : RECODE_OUTPUT);
  2738.  
  2739.         if (d->codepage != CODEPAGE_WIN && d->codepage != CODEPAGE_TRANS)
  2740.         {
  2741.             for (i=0;buf[i] != '';i++)
  2742.             {
  2743.                 if (buf[i] == (signed char)IAC)
  2744.                 {
  2745.                     int j;
  2746.  
  2747.                     for (j=length;j >= i;j--)
  2748.                         buf[j+1]=buf[j];
  2749.  
  2750.                     length++;
  2751.                     i++;
  2752.                 }
  2753.             }
  2754.         }
  2755.         else
  2756.         {
  2757.             for(i=0;buf[i] != '';i++)
  2758.                 if (buf[i] == (signed char)IAC) buf[i] = UPPER(buf[i]);
  2759.         }
  2760.     }
  2761.  
  2762.     if (d->out_compress)
  2763.         return writeCompressed(d, buf, length);
  2764.     else
  2765.         return write_to_descriptor_2(d->descriptor, buf, length);
  2766. }
  2767.  
  2768. int get_valid_align(CHAR_DATA *ch)
  2769. {
  2770.     return pc_race_table[ch->race].valid_align & class_table[ch->class].valid_align;
  2771. }
  2772.  
  2773.  
  2774. int is_only_align(CHAR_DATA *ch)
  2775. {
  2776.     switch(get_valid_align(ch))
  2777.     {
  2778.     case ALIGN_GOOD:     return ALIGN_GOOD;
  2779.     case ALIGN_NEUTRAL: return ALIGN_NEUTRAL;
  2780.     case ALIGN_EVIL:     return ALIGN_EVIL;
  2781.     default:             return 0;
  2782.     }
  2783. }
  2784.  
  2785. void show_valid_align(CHAR_DATA *ch)
  2786. {
  2787.     char buf[MAX_STRING_LENGTH];
  2788.     bool tm = FALSE;
  2789.     int va, cra;
  2790.  
  2791.     buf[0] = '';
  2792.      
  2793.     strlcpy(buf, "Ваш выбор [ ", sizeof(buf));
  2794.  
  2795.     cra = get_valid_align(ch);
  2796.  
  2797.     va = is_only_align(ch);
  2798.     write_to_buffer(ch->desc, "Вы можете быть", 0);
  2799.     if (va > 0)
  2800.         write_to_buffer(ch->desc," только", 0);
  2801.  
  2802.     if (IS_SET(cra, ALIGN_GOOD))
  2803.     {
  2804.         write_to_buffer(ch->desc," добрым", 0);
  2805.         if (va == 0)
  2806.             strlcat(buf, "(Д)обрый", sizeof(buf));
  2807.         tm = TRUE;
  2808.     }
  2809.  
  2810.     if (IS_SET(cra, ALIGN_NEUTRAL))
  2811.     {
  2812.         if (va == 0)
  2813.         {
  2814.             if (tm)
  2815.                 strcat(buf, "/");
  2816.             strlcat(buf, "(Н)ейтрал", sizeof(buf));
  2817.         }
  2818.         if (tm)
  2819.             write_to_buffer(ch->desc,",", 0);
  2820.         write_to_buffer(ch->desc, " нейтралом", 0);
  2821.         tm = TRUE;
  2822.     }
  2823.  
  2824.     if (IS_SET(cra, ALIGN_EVIL))
  2825.     {
  2826.         if (va == 0)
  2827.         {
  2828.             if (tm)
  2829.                 strlcat(buf, "/", sizeof(buf));
  2830.             strlcat(buf, "(З)лой", sizeof(buf));
  2831.         }
  2832.         if (tm)
  2833.             write_to_buffer(ch->desc," или", 0);
  2834.            
  2835.         write_to_buffer(ch->desc, " злым", 0);
  2836.     }
  2837.  
  2838.    write_to_buffer(ch->desc,".nr", 0);
  2839.    if (va > 0)
  2840.         write_to_buffer(ch->desc, "nr[Нажмите Enter для продолжения]nr", 0);
  2841.     else
  2842.     {
  2843.         strlcat(buf, " ] :nr", sizeof(buf));
  2844.         write_to_buffer(ch->desc, buf, 0);
  2845.     }
  2846. }
  2847.  
  2848. void strip_colors(char *str)
  2849. {
  2850.     char *p;
  2851.  
  2852.     for (p = str; *p != ''; p++)
  2853.     {
  2854.         while (*p == '{')
  2855.         {
  2856.             char *t;
  2857.  
  2858.             if (*(p+1) == '')
  2859.             {
  2860.                 *p = '';
  2861.                 break;
  2862.             }
  2863.  
  2864.             for(t = p; *t != ''; t++)
  2865.                 *t = *(t + 2);
  2866.         }
  2867.  
  2868.         if (*p == '')
  2869.             break;
  2870.  
  2871.     }
  2872. }
  2873.  
  2874. bool check_case(CHAR_DATA *ch, char *cs, int c)
  2875. {
  2876.     if (memcmp(cs, ch->name, strlen(ch->name) - 2))
  2877.     {
  2878.         char buf[MSL];
  2879.  
  2880.         sprintf(buf, "nr{WНеправильный падеж (%s)!{x Нажмите просто <Enter>, если согласны с падежом по-умолчанию [%s].{xnr",
  2881.                 cs, cases(ch->name, c));
  2882.         send_to_char(buf, ch);
  2883.         return FALSE;
  2884.     }
  2885.  
  2886.     return TRUE;
  2887. }
  2888.  
  2889.  
  2890.  
  2891. static int compensation_race[4524][7] =
  2892. {
  2893.         /*race,         class,     level,hp,mana,mv,pract*/
  2894.         {RACE_VAMPIRE,CLASS_VAMPIRE,0,0,0,0,0},
  2895.         {RACE_VAMPIRE,CLASS_VAMPIRE,1,0,0,0,0},
  2896.         {RACE_VAMPIRE,CLASS_VAMPIRE,2,0,0,0,0},
  2897.         {RACE_VAMPIRE,CLASS_VAMPIRE,3,0,0,0,0},
  2898.         {RACE_VAMPIRE,CLASS_VAMPIRE,4,0,0,0,0},
  2899.         {RACE_VAMPIRE,CLASS_VAMPIRE,5,0,0,0,0},
  2900.         {RACE_VAMPIRE,CLASS_VAMPIRE,6,0,0,0,0},
  2901.         {RACE_VAMPIRE,CLASS_VAMPIRE,7,0,0,0,0},
  2902.         {RACE_VAMPIRE,CLASS_VAMPIRE,8,0,0,0,0},
  2903.         {RACE_VAMPIRE,CLASS_VAMPIRE,9,0,0,0,0},
  2904.         {RACE_VAMPIRE,CLASS_VAMPIRE,10,79,0,0,0},
  2905.         {RACE_VAMPIRE,CLASS_VAMPIRE,11,81,0,0,0},
  2906.         {RACE_VAMPIRE,CLASS_VAMPIRE,12,83,0,0,0},
  2907.         {RACE_VAMPIRE,CLASS_VAMPIRE,13,85,0,0,0},
  2908.         {RACE_VAMPIRE,CLASS_VAMPIRE,14,87,0,0,0},
  2909.         {RACE_VAMPIRE,CLASS_VAMPIRE,15,89,0,0,0},
  2910.         {RACE_VAMPIRE,CLASS_VAMPIRE,16,91,0,0,0},
  2911.         {RACE_VAMPIRE,CLASS_VAMPIRE,17,93,0,0,0},
  2912.         {RACE_VAMPIRE,CLASS_VAMPIRE,18,95,0,0,0},
  2913.         {RACE_VAMPIRE,CLASS_VAMPIRE,19,97,0,0,0},
  2914.         {RACE_VAMPIRE,CLASS_VAMPIRE,20,99,0,0,0},
  2915.         {RACE_VAMPIRE,CLASS_VAMPIRE,21,101,0,0,0},
  2916.         {RACE_VAMPIRE,CLASS_VAMPIRE,22,103,0,0,0},
  2917.         {RACE_VAMPIRE,CLASS_VAMPIRE,23,105,0,0,0},
  2918.         {RACE_VAMPIRE,CLASS_VAMPIRE,24,107,0,0,0},
  2919.         {RACE_VAMPIRE,CLASS_VAMPIRE,25,109,0,0,0},
  2920.         {RACE_VAMPIRE,CLASS_VAMPIRE,26,111,0,0,0},
  2921.         {RACE_VAMPIRE,CLASS_VAMPIRE,27,113,0,0,0},
  2922.         {RACE_VAMPIRE,CLASS_VAMPIRE,28,115,0,0,0},
  2923.         {RACE_VAMPIRE,CLASS_VAMPIRE,29,117,0,0,0},
  2924.         {RACE_VAMPIRE,CLASS_VAMPIRE,30,119,0,0,0},
  2925.         {RACE_VAMPIRE,CLASS_VAMPIRE,31,121,0,0,0},
  2926.         {RACE_VAMPIRE,CLASS_VAMPIRE,32,123,0,0,0},
  2927.         {RACE_VAMPIRE,CLASS_VAMPIRE,33,125,0,0,0},
  2928.         {RACE_VAMPIRE,CLASS_VAMPIRE,34,127,0,0,0},
  2929.         {RACE_VAMPIRE,CLASS_VAMPIRE,35,129,0,0,0},
  2930.         {RACE_VAMPIRE,CLASS_VAMPIRE,36,131,0,0,0},
  2931.         {RACE_VAMPIRE,CLASS_VAMPIRE,37,133,0,0,0},
  2932.         {RACE_VAMPIRE,CLASS_VAMPIRE,38,135,0,0,0},
  2933.         {RACE_VAMPIRE,CLASS_VAMPIRE,39,137,0,0,0},
  2934.         {RACE_VAMPIRE,CLASS_VAMPIRE,40,139,0,0,0},
  2935.         {RACE_VAMPIRE,CLASS_VAMPIRE,41,141,0,0,0},
  2936.         {RACE_VAMPIRE,CLASS_VAMPIRE,42,143,0,0,0},
  2937.         {RACE_VAMPIRE,CLASS_VAMPIRE,43,145,0,0,0},
  2938.         {RACE_VAMPIRE,CLASS_VAMPIRE,44,147,0,0,0},
  2939.         {RACE_VAMPIRE,CLASS_VAMPIRE,45,149,0,0,0},
  2940.         {RACE_VAMPIRE,CLASS_VAMPIRE,46,151,0,0,0},
  2941.         {RACE_VAMPIRE,CLASS_VAMPIRE,47,153,0,0,0},
  2942.         {RACE_VAMPIRE,CLASS_VAMPIRE,48,155,0,0,0},
  2943.         {RACE_VAMPIRE,CLASS_VAMPIRE,49,157,0,0,0},
  2944.         {RACE_VAMPIRE,CLASS_VAMPIRE,50,159,0,0,0},
  2945.         {RACE_VAMPIRE,CLASS_VAMPIRE,51,162,0,0,0},
  2946.         {RACE_DWARF,CLASS_WARRIOR,0,0,0,0,0},
  2947.         {RACE_DWARF,CLASS_WARRIOR,1,2,0,0,0},
  2948.         {RACE_DWARF,CLASS_WARRIOR,2,4,0,0,0},
  2949.         {RACE_DWARF,CLASS_WARRIOR,3,6,0,0,0},
  2950.         {RACE_DWARF,CLASS_WARRIOR,4,8,1,0,0},
  2951.         {RACE_DWARF,CLASS_WARRIOR,5,10,1,0,0},
  2952.         {RACE_DWARF,CLASS_WARRIOR,6,12,2,0,0},
  2953.         {RACE_DWARF,CLASS_WARRIOR,7,14,2,0,0},
  2954.         {RACE_DWARF,CLASS_WARRIOR,8,16,1,0,0},
  2955.         {RACE_DWARF,CLASS_WARRIOR,9,18,2,0,0},
  2956.         {RACE_DWARF,CLASS_WARRIOR,10,20,2,0,0},
  2957.         {RACE_DWARF,CLASS_WARRIOR,11,22,3,0,0},
  2958.         {RACE_DWARF,CLASS_WARRIOR,12,24,3,0,0},
  2959.         {RACE_DWARF,CLASS_WARRIOR,13,26,3,0,0},
  2960.         {RACE_DWARF,CLASS_WARRIOR,14,28,3,0,0},
  2961.         {RACE_DWARF,CLASS_WARRIOR,15,30,4,0,0},
  2962.         {RACE_DWARF,CLASS_WARRIOR,16,32,5,0,0},
  2963.         {RACE_DWARF,CLASS_WARRIOR,17,34,4,0,0},
  2964.         {RACE_DWARF,CLASS_WARRIOR,18,36,3,0,0},
  2965.         {RACE_DWARF,CLASS_WARRIOR,19,38,3,0,0},
  2966.         {RACE_DWARF,CLASS_WARRIOR,20,40,2,0,0},
  2967.         {RACE_DWARF,CLASS_WARRIOR,21,42,2,0,0},
  2968.         {RACE_DWARF,CLASS_WARRIOR,22,44,2,0,0},
  2969.         {RACE_DWARF,CLASS_WARRIOR,23,46,2,0,0},
  2970.         {RACE_DWARF,CLASS_WARRIOR,24,48,3,0,0},
  2971.         {RACE_DWARF,CLASS_WARRIOR,25,50,3,0,0},
  2972.         {RACE_DWARF,CLASS_WARRIOR,26,52,3,0,0},
  2973.         {RACE_DWARF,CLASS_WARRIOR,27,54,2,0,0},
  2974.         {RACE_DWARF,CLASS_WARRIOR,28,56,1,0,0},
  2975.         {RACE_DWARF,CLASS_WARRIOR,29,58,0,0,0},
  2976.         {RACE_DWARF,CLASS_WARRIOR,30,60,0,0,0},
  2977.         {RACE_DWARF,CLASS_WARRIOR,31,62,0,0,0},
  2978.         {RACE_DWARF,CLASS_WARRIOR,32,64,0,0,0},
  2979.         {RACE_DWARF,CLASS_WARRIOR,33,66,0,0,0},
  2980.         {RACE_DWARF,CLASS_WARRIOR,34,68,1,0,0},
  2981.         {RACE_DWARF,CLASS_WARRIOR,35,70,1,0,0},
  2982.         {RACE_DWARF,CLASS_WARRIOR,36,72,1,0,0},
  2983.         {RACE_DWARF,CLASS_WARRIOR,37,74,2,0,0},
  2984.         {RACE_DWARF,CLASS_WARRIOR,38,76,2,0,0},
  2985.         {RACE_DWARF,CLASS_WARRIOR,39,78,2,0,0},
  2986.         {RACE_DWARF,CLASS_WARRIOR,40,80,2,0,0},
  2987.         {RACE_DWARF,CLASS_WARRIOR,41,82,1,0,0},
  2988.         {RACE_DWARF,CLASS_WARRIOR,42,84,2,0,0},
  2989.         {RACE_DWARF,CLASS_WARRIOR,43,86,3,0,0},
  2990.         {RACE_DWARF,CLASS_WARRIOR,44,88,2,0,0},
  2991.         {RACE_DWARF,CLASS_WARRIOR,45,90,1,0,0},
  2992.         {RACE_DWARF,CLASS_WARRIOR,46,92,1,0,0},
  2993.         {RACE_DWARF,CLASS_WARRIOR,47,94,1,0,0},
  2994.         {RACE_DWARF,CLASS_WARRIOR,48,96,1,0,0},
  2995.         {RACE_DWARF,CLASS_WARRIOR,49,98,1,0,0},
  2996.         {RACE_DWARF,CLASS_WARRIOR,50,100,2,0,0},
  2997.         {RACE_DWARF,CLASS_WARRIOR,51,102,2,0,0},
  2998.         {RACE_DWARF,CLASS_DRUID,0,0,0,0,0},
  2999.         {RACE_DWARF,CLASS_DRUID,1,2,0,0,1},
  3000.         {RACE_DWARF,CLASS_DRUID,2,4,0,0,2},
  3001.         {RACE_DWARF,CLASS_DRUID,3,6,0,0,3},
  3002.         {RACE_DWARF,CLASS_DRUID,4,8,0,0,4},
  3003.         {RACE_DWARF,CLASS_DRUID,5,10,0,0,5},
  3004.         {RACE_DWARF,CLASS_DRUID,6,12,0,0,6},
  3005.         {RACE_DWARF,CLASS_DRUID,7,14,0,0,7},
  3006.         {RACE_DWARF,CLASS_DRUID,8,16,0,0,8},
  3007.         {RACE_DWARF,CLASS_DRUID,9,18,0,0,9},
  3008.         {RACE_DWARF,CLASS_DRUID,10,20,0,0,10},
  3009.         {RACE_DWARF,CLASS_DRUID,11,22,0,0,11},
  3010.         {RACE_DWARF,CLASS_DRUID,12,24,0,0,12},
  3011.         {RACE_DWARF,CLASS_DRUID,13,26,0,0,13},
  3012.         {RACE_DWARF,CLASS_DRUID,14,28,0,0,14},
  3013.         {RACE_DWARF,CLASS_DRUID,15,30,0,0,15},
  3014.         {RACE_DWARF,CLASS_DRUID,16,32,0,0,16},
  3015.         {RACE_DWARF,CLASS_DRUID,17,34,0,0,17},
  3016.         {RACE_DWARF,CLASS_DRUID,18,36,0,0,18},
  3017.         {RACE_DWARF,CLASS_DRUID,19,38,0,0,19},
  3018.         {RACE_DWARF,CLASS_DRUID,20,40,0,0,20},
  3019.         {RACE_DWARF,CLASS_DRUID,21,42,0,0,21},
  3020.         {RACE_DWARF,CLASS_DRUID,22,44,0,0,22},
  3021.         {RACE_DWARF,CLASS_DRUID,23,46,0,0,23},
  3022.         {RACE_DWARF,CLASS_DRUID,24,48,0,0,24},
  3023.         {RACE_DWARF,CLASS_DRUID,25,50,0,0,25},
  3024.         {RACE_DWARF,CLASS_DRUID,26,52,0,0,26},
  3025.         {RACE_DWARF,CLASS_DRUID,27,54,0,0,27},
  3026.         {RACE_DWARF,CLASS_DRUID,28,56,0,0,28},
  3027.         {RACE_DWARF,CLASS_DRUID,29,58,0,0,29},
  3028.         {RACE_DWARF,CLASS_DRUID,30,60,0,0,30},
  3029.         {RACE_DWARF,CLASS_DRUID,31,62,0,0,31},
  3030.         {RACE_DWARF,CLASS_DRUID,32,64,0,0,32},
  3031.         {RACE_DWARF,CLASS_DRUID,33,66,0,0,33},
  3032.         {RACE_DWARF,CLASS_DRUID,34,68,0,0,34},
  3033.         {RACE_DWARF,CLASS_DRUID,35,70,0,0,35},
  3034.         {RACE_DWARF,CLASS_DRUID,36,72,0,0,36},
  3035.         {RACE_DWARF,CLASS_DRUID,37,74,0,0,37},
  3036.         {RACE_DWARF,CLASS_DRUID,38,76,0,0,38},
  3037.         {RACE_DWARF,CLASS_DRUID,39,78,0,0,39},
  3038.         {RACE_DWARF,CLASS_DRUID,40,80,0,0,40},
  3039.         {RACE_DWARF,CLASS_DRUID,41,82,0,0,41},
  3040.         {RACE_DWARF,CLASS_DRUID,42,84,0,0,42},
  3041.         {RACE_DWARF,CLASS_DRUID,43,86,0,0,43},
  3042.         {RACE_DWARF,CLASS_DRUID,44,88,0,0,44},
  3043.         {RACE_DWARF,CLASS_DRUID,45,90,0,0,45},
  3044.         {RACE_DWARF,CLASS_DRUID,46,92,0,0,46},
  3045.         {RACE_DWARF,CLASS_DRUID,47,94,0,0,47},
  3046.         {RACE_DWARF,CLASS_DRUID,48,96,0,0,48},
  3047.         {RACE_DWARF,CLASS_DRUID,49,98,0,0,49},
  3048.         {RACE_DWARF,CLASS_DRUID,50,100,0,0,50},
  3049.         {RACE_DWARF,CLASS_DRUID,51,102,0,0,51},
  3050.         {RACE_DWARF,CLASS_CLERIC,0,0,0,0,0},
  3051.         {RACE_DWARF,CLASS_CLERIC,1,2,0,0,0},
  3052.         {RACE_DWARF,CLASS_CLERIC,2,4,0,0,0},
  3053.         {RACE_DWARF,CLASS_CLERIC,3,6,0,0,0},
  3054.         {RACE_DWARF,CLASS_CLERIC,4,8,0,0,0},
  3055.         {RACE_DWARF,CLASS_CLERIC,5,10,0,0,0},
  3056.         {RACE_DWARF,CLASS_CLERIC,6,12,0,0,0},
  3057.         {RACE_DWARF,CLASS_CLERIC,7,14,0,0,0},
  3058.         {RACE_DWARF,CLASS_CLERIC,8,16,0,0,0},
  3059.         {RACE_DWARF,CLASS_CLERIC,9,18,0,0,0},
  3060.         {RACE_DWARF,CLASS_CLERIC,10,20,0,0,0},
  3061.         {RACE_DWARF,CLASS_CLERIC,11,22,0,0,0},
  3062.         {RACE_DWARF,CLASS_CLERIC,12,24,0,0,0},
  3063.         {RACE_DWARF,CLASS_CLERIC,13,26,0,0,0},
  3064.         {RACE_DWARF,CLASS_CLERIC,14,28,0,0,0},
  3065.         {RACE_DWARF,CLASS_CLERIC,15,30,0,0,0},
  3066.         {RACE_DWARF,CLASS_CLERIC,16,32,0,0,0},
  3067.         {RACE_DWARF,CLASS_CLERIC,17,34,0,0,0},
  3068.         {RACE_DWARF,CLASS_CLERIC,18,36,0,0,0},
  3069.         {RACE_DWARF,CLASS_CLERIC,19,38,0,0,0},
  3070.         {RACE_DWARF,CLASS_CLERIC,20,40,0,0,0},
  3071.         {RACE_DWARF,CLASS_CLERIC,21,42,0,0,0},
  3072.         {RACE_DWARF,CLASS_CLERIC,22,44,0,0,0},
  3073.         {RACE_DWARF,CLASS_CLERIC,23,46,0,0,0},
  3074.         {RACE_DWARF,CLASS_CLERIC,24,48,0,0,0},
  3075.         {RACE_DWARF,CLASS_CLERIC,25,50,0,0,0},
  3076.         {RACE_DWARF,CLASS_CLERIC,26,52,0,0,0},
  3077.         {RACE_DWARF,CLASS_CLERIC,27,54,0,0,0},
  3078.         {RACE_DWARF,CLASS_CLERIC,28,56,0,0,0},
  3079.         {RACE_DWARF,CLASS_CLERIC,29,58,0,0,0},
  3080.         {RACE_DWARF,CLASS_CLERIC,30,60,0,0,0},
  3081.         {RACE_DWARF,CLASS_CLERIC,31,62,0,0,0},
  3082.         {RACE_DWARF,CLASS_CLERIC,32,64,0,0,0},
  3083.         {RACE_DWARF,CLASS_CLERIC,33,66,0,0,0},
  3084.         {RACE_DWARF,CLASS_CLERIC,34,68,0,0,0},
  3085.         {RACE_DWARF,CLASS_CLERIC,35,70,0,0,0},
  3086.         {RACE_DWARF,CLASS_CLERIC,36,72,0,0,0},
  3087.         {RACE_DWARF,CLASS_CLERIC,37,74,0,0,0},
  3088.         {RACE_DWARF,CLASS_CLERIC,38,76,0,0,0},
  3089.         {RACE_DWARF,CLASS_CLERIC,39,78,0,0,0},
  3090.         {RACE_DWARF,CLASS_CLERIC,40,80,0,0,0},
  3091.         {RACE_DWARF,CLASS_CLERIC,41,82,0,0,0},
  3092.         {RACE_DWARF,CLASS_CLERIC,42,84,0,0,0},
  3093.         {RACE_DWARF,CLASS_CLERIC,43,86,0,0,0},
  3094.         {RACE_DWARF,CLASS_CLERIC,44,88,0,0,0},
  3095.         {RACE_DWARF,CLASS_CLERIC,45,90,0,0,0},
  3096.         {RACE_DWARF,CLASS_CLERIC,46,92,1,0,0},
  3097.         {RACE_DWARF,CLASS_CLERIC,47,94,1,0,0},
  3098.         {RACE_DWARF,CLASS_CLERIC,48,96,1,0,0},
  3099.         {RACE_DWARF,CLASS_CLERIC,49,98,1,0,0},
  3100.         {RACE_DWARF,CLASS_CLERIC,50,100,1,0,0},
  3101.         {RACE_DWARF,CLASS_CLERIC,51,102,1,0,0},
  3102.         {RACE_DWARF,CLASS_THIEF,0,0,0,0,0},
  3103.         {RACE_DWARF,CLASS_THIEF,1,2,1,0,0},
  3104.         {RACE_DWARF,CLASS_THIEF,2,4,1,0,0},
  3105.         {RACE_DWARF,CLASS_THIEF,3,6,1,0,0},
  3106.         {RACE_DWARF,CLASS_THIEF,4,8,1,0,0},
  3107.         {RACE_DWARF,CLASS_THIEF,5,10,0,0,0},
  3108.         {RACE_DWARF,CLASS_THIEF,6,12,0,0,0},
  3109.         {RACE_DWARF,CLASS_THIEF,7,14,1,0,0},
  3110.         {RACE_DWARF,CLASS_THIEF,8,16,1,0,0},
  3111.         {RACE_DWARF,CLASS_THIEF,9,18,1,0,0},
  3112.         {RACE_DWARF,CLASS_THIEF,10,20,2,0,0},
  3113.         {RACE_DWARF,CLASS_THIEF,11,22,2,0,0},
  3114.         {RACE_DWARF,CLASS_THIEF,12,24,2,0,0},
  3115.         {RACE_DWARF,CLASS_THIEF,13,26,2,0,0},
  3116.         {RACE_DWARF,CLASS_THIEF,14,28,3,0,0},
  3117.         {RACE_DWARF,CLASS_THIEF,15,30,3,0,0},
  3118.         {RACE_DWARF,CLASS_THIEF,16,32,3,0,0},
  3119.         {RACE_DWARF,CLASS_THIEF,17,34,2,0,0},
  3120.         {RACE_DWARF,CLASS_THIEF,18,36,1,0,0},
  3121.         {RACE_DWARF,CLASS_THIEF,19,38,2,0,0},
  3122.         {RACE_DWARF,CLASS_THIEF,20,40,1,0,0},
  3123.         {RACE_DWARF,CLASS_THIEF,21,42,2,0,0},
  3124.         {RACE_DWARF,CLASS_THIEF,22,44,1,0,0},
  3125.         {RACE_DWARF,CLASS_THIEF,23,46,1,0,0},
  3126.         {RACE_DWARF,CLASS_THIEF,24,48,0,0,0},
  3127.         {RACE_DWARF,CLASS_THIEF,25,50,1,0,0},
  3128.         {RACE_DWARF,CLASS_THIEF,26,52,1,0,0},
  3129.         {RACE_DWARF,CLASS_THIEF,27,54,2,0,0},
  3130.         {RACE_DWARF,CLASS_THIEF,28,56,2,0,0},
  3131.         {RACE_DWARF,CLASS_THIEF,29,58,1,0,0},
  3132.         {RACE_DWARF,CLASS_THIEF,30,60,0,0,0},
  3133.         {RACE_DWARF,CLASS_THIEF,31,62,1,0,0},
  3134.         {RACE_DWARF,CLASS_THIEF,32,64,0,0,0},
  3135.         {RACE_DWARF,CLASS_THIEF,33,66,1,0,0},
  3136.         {RACE_DWARF,CLASS_THIEF,34,68,1,0,0},
  3137.         {RACE_DWARF,CLASS_THIEF,35,70,1,0,0},
  3138.         {RACE_DWARF,CLASS_THIEF,36,72,2,0,0},
  3139.         {RACE_DWARF,CLASS_THIEF,37,74,1,0,0},
  3140.         {RACE_DWARF,CLASS_THIEF,38,76,1,0,0},
  3141.         {RACE_DWARF,CLASS_THIEF,39,78,0,0,0},
  3142.         {RACE_DWARF,CLASS_THIEF,40,80,1,0,0},
  3143.         {RACE_DWARF,CLASS_THIEF,41,82,0,0,0},
  3144.         {RACE_DWARF,CLASS_THIEF,42,84,0,0,0},
  3145.         {RACE_DWARF,CLASS_THIEF,43,86,1,0,0},
  3146.         {RACE_DWARF,CLASS_THIEF,44,88,1,0,0},
  3147.         {RACE_DWARF,CLASS_THIEF,45,90,1,0,0},
  3148.         {RACE_DWARF,CLASS_THIEF,46,92,2,0,0},
  3149.         {RACE_DWARF,CLASS_THIEF,47,94,1,0,0},
  3150.         {RACE_DWARF,CLASS_THIEF,48,96,2,0,0},
  3151.         {RACE_DWARF,CLASS_THIEF,49,98,2,0,0},
  3152.         {RACE_DWARF,CLASS_THIEF,50,100,3,0,0},
  3153.         {RACE_DWARF,CLASS_THIEF,51,102,3,0,0},
  3154.         {RACE_DWARF,CLASS_RANGER,0,0,0,0,0},
  3155.         {RACE_DWARF,CLASS_RANGER,1,2,0,0,0},
  3156.         {RACE_DWARF,CLASS_RANGER,2,4,0,0,0},
  3157.         {RACE_DWARF,CLASS_RANGER,3,6,0,0,0},
  3158.         {RACE_DWARF,CLASS_RANGER,4,8,0,0,0},
  3159.         {RACE_DWARF,CLASS_RANGER,5,10,0,0,0},
  3160.         {RACE_DWARF,CLASS_RANGER,6,12,1,0,0},
  3161.         {RACE_DWARF,CLASS_RANGER,7,14,0,0,0},
  3162.         {RACE_DWARF,CLASS_RANGER,8,16,0,0,0},
  3163.         {RACE_DWARF,CLASS_RANGER,9,18,0,0,0},
  3164.         {RACE_DWARF,CLASS_RANGER,10,20,0,0,0},
  3165.         {RACE_DWARF,CLASS_RANGER,11,22,1,0,0},
  3166.         {RACE_DWARF,CLASS_RANGER,12,24,0,0,0},
  3167.         {RACE_DWARF,CLASS_RANGER,13,26,1,0,0},
  3168.         {RACE_DWARF,CLASS_RANGER,14,28,2,0,0},
  3169.         {RACE_DWARF,CLASS_RANGER,15,30,3,0,0},
  3170.         {RACE_DWARF,CLASS_RANGER,16,32,4,0,0},
  3171.         {RACE_DWARF,CLASS_RANGER,17,34,5,0,0},
  3172.         {RACE_DWARF,CLASS_RANGER,18,36,5,0,0},
  3173.         {RACE_DWARF,CLASS_RANGER,19,38,5,0,0},
  3174.         {RACE_DWARF,CLASS_RANGER,20,40,4,0,0},
  3175.         {RACE_DWARF,CLASS_RANGER,21,42,5,0,0},
  3176.         {RACE_DWARF,CLASS_RANGER,22,44,5,0,0},
  3177.         {RACE_DWARF,CLASS_RANGER,23,46,5,0,0},
  3178.         {RACE_DWARF,CLASS_RANGER,24,48,6,0,0},
  3179.         {RACE_DWARF,CLASS_RANGER,25,50,5,0,0},
  3180.         {RACE_DWARF,CLASS_RANGER,26,52,5,0,0},
  3181.         {RACE_DWARF,CLASS_RANGER,27,54,5,0,0},
  3182.         {RACE_DWARF,CLASS_RANGER,28,56,6,0,0},
  3183.         {RACE_DWARF,CLASS_RANGER,29,58,7,0,0},
  3184.         {RACE_DWARF,CLASS_RANGER,30,60,7,0,0},
  3185.         {RACE_DWARF,CLASS_RANGER,31,62,7,0,0},
  3186.         {RACE_DWARF,CLASS_RANGER,32,64,8,0,0},
  3187.         {RACE_DWARF,CLASS_RANGER,33,66,8,0,0},
  3188.         {RACE_DWARF,CLASS_RANGER,34,68,8,0,0},
  3189.         {RACE_DWARF,CLASS_RANGER,35,70,9,0,0},
  3190.         {RACE_DWARF,CLASS_RANGER,36,72,8,0,0},
  3191.         {RACE_DWARF,CLASS_RANGER,37,74,7,0,0},
  3192.         {RACE_DWARF,CLASS_RANGER,38,76,8,0,0},
  3193.         {RACE_DWARF,CLASS_RANGER,39,78,9,0,0},
  3194.         {RACE_DWARF,CLASS_RANGER,40,80,10,0,0},
  3195.         {RACE_DWARF,CLASS_RANGER,41,82,11,0,0},
  3196.         {RACE_DWARF,CLASS_RANGER,42,84,12,0,0},
  3197.         {RACE_DWARF,CLASS_RANGER,43,86,11,0,0},
  3198.         {RACE_DWARF,CLASS_RANGER,44,88,12,0,0},
  3199.         {RACE_DWARF,CLASS_RANGER,45,90,12,0,0},
  3200.         {RACE_DWARF,CLASS_RANGER,46,92,13,0,0},
  3201.         {RACE_DWARF,CLASS_RANGER,47,94,13,0,0},
  3202.         {RACE_DWARF,CLASS_RANGER,48,96,13,0,0},
  3203.         {RACE_DWARF,CLASS_RANGER,49,98,14,0,0},
  3204.         {RACE_DWARF,CLASS_RANGER,50,100,14,0,0},
  3205.         {RACE_DWARF,CLASS_RANGER,51,102,13,0,0},
  3206.         {RACE_DWARF,CLASS_MAGE,0,0,0,0,0},
  3207.         {RACE_DWARF,CLASS_MAGE,1,2,0,0,0},
  3208.         {RACE_DWARF,CLASS_MAGE,2,4,1,0,0},
  3209.         {RACE_DWARF,CLASS_MAGE,3,6,1,0,0},
  3210.         {RACE_DWARF,CLASS_MAGE,4,8,2,0,0},
  3211.         {RACE_DWARF,CLASS_MAGE,5,11,3,0,0},
  3212.         {RACE_DWARF,CLASS_MAGE,6,14,4,0,0},
  3213.         {RACE_DWARF,CLASS_MAGE,7,16,5,0,0},
  3214.         {RACE_DWARF,CLASS_MAGE,8,18,5,0,0},
  3215.         {RACE_DWARF,CLASS_MAGE,9,20,5,0,0},
  3216.         {RACE_DWARF,CLASS_MAGE,10,22,6,0,0},
  3217.         {RACE_DWARF,CLASS_MAGE,11,25,7,0,0},
  3218.         {RACE_DWARF,CLASS_MAGE,12,28,8,0,0},
  3219.         {RACE_DWARF,CLASS_MAGE,13,30,9,0,0},
  3220.         {RACE_DWARF,CLASS_MAGE,14,33,10,0,0},
  3221.         {RACE_DWARF,CLASS_MAGE,15,35,10,0,0},
  3222.         {RACE_DWARF,CLASS_MAGE,16,38,11,0,0},
  3223.         {RACE_DWARF,CLASS_MAGE,17,40,12,0,0},
  3224.         {RACE_DWARF,CLASS_MAGE,18,42,13,0,0},
  3225.         {RACE_DWARF,CLASS_MAGE,19,45,14,0,0},
  3226.         {RACE_DWARF,CLASS_MAGE,20,46,14,0,0},
  3227.         {RACE_DWARF,CLASS_MAGE,21,48,15,0,0},
  3228.         {RACE_DWARF,CLASS_MAGE,22,50,15,0,0},
  3229.         {RACE_DWARF,CLASS_MAGE,23,53,16,0,0},
  3230.         {RACE_DWARF,CLASS_MAGE,24,55,17,0,0},
  3231.         {RACE_DWARF,CLASS_MAGE,25,57,17,0,0},
  3232.         {RACE_DWARF,CLASS_MAGE,26,59,18,0,0},
  3233.         {RACE_DWARF,CLASS_MAGE,27,61,18,0,0},
  3234.         {RACE_DWARF,CLASS_MAGE,28,63,19,0,0},
  3235.         {RACE_DWARF,CLASS_MAGE,29,65,19,0,0},
  3236.         {RACE_DWARF,CLASS_MAGE,30,67,20,0,0},
  3237.         {RACE_DWARF,CLASS_MAGE,31,69,20,0,0},
  3238.         {RACE_DWARF,CLASS_MAGE,32,71,21,0,0},
  3239.         {RACE_DWARF,CLASS_MAGE,33,73,22,0,0},
  3240.         {RACE_DWARF,CLASS_MAGE,34,75,23,0,0},
  3241.         {RACE_DWARF,CLASS_MAGE,35,77,23,0,0},
  3242.         {RACE_DWARF,CLASS_MAGE,36,80,24,0,0},
  3243.         {RACE_DWARF,CLASS_MAGE,37,81,24,0,0},
  3244.         {RACE_DWARF,CLASS_MAGE,38,83,24,0,0},
  3245.         {RACE_DWARF,CLASS_MAGE,39,85,25,0,0},
  3246.         {RACE_DWARF,CLASS_MAGE,40,87,26,0,0},
  3247.         {RACE_DWARF,CLASS_MAGE,41,88,26,0,0},
  3248.         {RACE_DWARF,CLASS_MAGE,42,89,27,0,0},
  3249.         {RACE_DWARF,CLASS_MAGE,43,91,28,0,0},
  3250.         {RACE_DWARF,CLASS_MAGE,44,93,28,0,0},
  3251.         {RACE_DWARF,CLASS_MAGE,45,95,29,0,0},
  3252.         {RACE_DWARF,CLASS_MAGE,46,97,30,0,0},
  3253.         {RACE_DWARF,CLASS_MAGE,47,99,31,0,0},
  3254.         {RACE_DWARF,CLASS_MAGE,48,101,32,0,0},
  3255.         {RACE_DWARF,CLASS_MAGE,49,103,33,0,0},
  3256.         {RACE_DWARF,CLASS_MAGE,50,106,33,0,0},
  3257.         {RACE_DWARF,CLASS_MAGE,51,108,33,0,0},
  3258.         {RACE_DWARF,CLASS_ALCHEMIST,0,0,0,0,0},
  3259.         {RACE_DWARF,CLASS_ALCHEMIST,1,2,0,0,1},
  3260.         {RACE_DWARF,CLASS_ALCHEMIST,2,4,0,0,2},
  3261.         {RACE_DWARF,CLASS_ALCHEMIST,3,6,0,0,3},
  3262.         {RACE_DWARF,CLASS_ALCHEMIST,4,8,0,0,4},
  3263.         {RACE_DWARF,CLASS_ALCHEMIST,5,10,0,0,5},
  3264.         {RACE_DWARF,CLASS_ALCHEMIST,6,12,0,0,6},
  3265.         {RACE_DWARF,CLASS_ALCHEMIST,7,14,0,0,7},
  3266.         {RACE_DWARF,CLASS_ALCHEMIST,8,16,0,0,8},
  3267.         {RACE_DWARF,CLASS_ALCHEMIST,9,18,0,0,9},
  3268.         {RACE_DWARF,CLASS_ALCHEMIST,10,20,0,0,10},
  3269.         {RACE_DWARF,CLASS_ALCHEMIST,11,22,0,0,11},
  3270.         {RACE_DWARF,CLASS_ALCHEMIST,12,24,0,0,12},
  3271.         {RACE_DWARF,CLASS_ALCHEMIST,13,26,0,0,13},
  3272.         {RACE_DWARF,CLASS_ALCHEMIST,14,28,0,0,14},
  3273.         {RACE_DWARF,CLASS_ALCHEMIST,15,30,0,0,15},
  3274.         {RACE_DWARF,CLASS_ALCHEMIST,16,32,0,0,16},
  3275.         {RACE_DWARF,CLASS_ALCHEMIST,17,34,0,0,17},
  3276.         {RACE_DWARF,CLASS_ALCHEMIST,18,36,0,0,18},
  3277.         {RACE_DWARF,CLASS_ALCHEMIST,19,38,0,0,19},
  3278.         {RACE_DWARF,CLASS_ALCHEMIST,20,40,0,0,20},
  3279.         {RACE_DWARF,CLASS_ALCHEMIST,21,42,0,0,21},
  3280.         {RACE_DWARF,CLASS_ALCHEMIST,22,44,0,0,22},
  3281.         {RACE_DWARF,CLASS_ALCHEMIST,23,46,0,0,23},
  3282.         {RACE_DWARF,CLASS_ALCHEMIST,24,48,0,0,24},
  3283.         {RACE_DWARF,CLASS_ALCHEMIST,25,50,0,0,25},
  3284.         {RACE_DWARF,CLASS_ALCHEMIST,26,52,0,0,26},
  3285.         {RACE_DWARF,CLASS_ALCHEMIST,27,54,0,0,27},
  3286.         {RACE_DWARF,CLASS_ALCHEMIST,28,56,0,0,28},
  3287.         {RACE_DWARF,CLASS_ALCHEMIST,29,58,0,0,29},
  3288.         {RACE_DWARF,CLASS_ALCHEMIST,30,60,0,0,30},
  3289.         {RACE_DWARF,CLASS_ALCHEMIST,31,62,0,0,31},
  3290.         {RACE_DWARF,CLASS_ALCHEMIST,32,64,0,0,32},
  3291.         {RACE_DWARF,CLASS_ALCHEMIST,33,66,0,0,33},
  3292.         {RACE_DWARF,CLASS_ALCHEMIST,34,68,0,0,34},
  3293.         {RACE_DWARF,CLASS_ALCHEMIST,35,70,0,0,35},
  3294.         {RACE_DWARF,CLASS_ALCHEMIST,36,72,0,0,36},
  3295.         {RACE_DWARF,CLASS_ALCHEMIST,37,74,0,0,37},
  3296.         {RACE_DWARF,CLASS_ALCHEMIST,38,76,0,0,38},
  3297.         {RACE_DWARF,CLASS_ALCHEMIST,39,78,0,0,39},
  3298.         {RACE_DWARF,CLASS_ALCHEMIST,40,80,0,0,40},
  3299.         {RACE_DWARF,CLASS_ALCHEMIST,41,82,0,0,41},
  3300.         {RACE_DWARF,CLASS_ALCHEMIST,42,84,0,0,42},
  3301.         {RACE_DWARF,CLASS_ALCHEMIST,43,86,0,0,43},
  3302.         {RACE_DWARF,CLASS_ALCHEMIST,44,88,0,0,44},
  3303.         {RACE_DWARF,CLASS_ALCHEMIST,45,90,0,0,45},
  3304.         {RACE_DWARF,CLASS_ALCHEMIST,46,92,0,0,46},
  3305.         {RACE_DWARF,CLASS_ALCHEMIST,47,94,0,0,47},
  3306.         {RACE_DWARF,CLASS_ALCHEMIST,48,96,0,0,48},
  3307.         {RACE_DWARF,CLASS_ALCHEMIST,49,98,0,0,49},
  3308.         {RACE_DWARF,CLASS_ALCHEMIST,50,100,0,0,50},
  3309.         {RACE_DWARF,CLASS_ALCHEMIST,51,102,0,0,51},
  3310.         {RACE_DWARF,CLASS_PALADIN,0,0,0,0,0},
  3311.         {RACE_DWARF,CLASS_PALADIN,1,1,0,0,1},
  3312.         {RACE_DWARF,CLASS_PALADIN,2,2,0,0,2},
  3313.         {RACE_DWARF,CLASS_PALADIN,3,4,0,0,3},
  3314.         {RACE_DWARF,CLASS_PALADIN,4,5,0,0,4},
  3315.         {RACE_DWARF,CLASS_PALADIN,5,7,0,0,5},
  3316.         {RACE_DWARF,CLASS_PALADIN,6,9,0,0,6},
  3317.         {RACE_DWARF,CLASS_PALADIN,7,10,0,0,7},
  3318.         {RACE_DWARF,CLASS_PALADIN,8,12,1,0,8},
  3319.         {RACE_DWARF,CLASS_PALADIN,9,14,1,0,9},
  3320.         {RACE_DWARF,CLASS_PALADIN,10,15,1,0,10},
  3321.         {RACE_DWARF,CLASS_PALADIN,11,17,1,0,11},
  3322.         {RACE_DWARF,CLASS_PALADIN,12,19,1,0,12},
  3323.         {RACE_DWARF,CLASS_PALADIN,13,21,1,0,13},
  3324.         {RACE_DWARF,CLASS_PALADIN,14,23,1,0,14},
  3325.         {RACE_DWARF,CLASS_PALADIN,15,24,1,0,15},
  3326.         {RACE_DWARF,CLASS_PALADIN,16,26,1,0,16},
  3327.         {RACE_DWARF,CLASS_PALADIN,17,27,1,0,17},
  3328.         {RACE_DWARF,CLASS_PALADIN,18,29,1,0,18},
  3329.         {RACE_DWARF,CLASS_PALADIN,19,30,1,0,19},
  3330.         {RACE_DWARF,CLASS_PALADIN,20,32,1,0,20},
  3331.         {RACE_DWARF,CLASS_PALADIN,21,34,1,0,21},
  3332.         {RACE_DWARF,CLASS_PALADIN,22,36,1,0,22},
  3333.         {RACE_DWARF,CLASS_PALADIN,23,37,1,0,23},
  3334.         {RACE_DWARF,CLASS_PALADIN,24,39,1,0,24},
  3335.         {RACE_DWARF,CLASS_PALADIN,25,41,1,0,25},
  3336.         {RACE_DWARF,CLASS_PALADIN,26,43,1,0,26},
  3337.         {RACE_DWARF,CLASS_PALADIN,27,45,1,0,27},
  3338.         {RACE_DWARF,CLASS_PALADIN,28,47,1,0,28},
  3339.         {RACE_DWARF,CLASS_PALADIN,29,48,1,0,29},
  3340.         {RACE_DWARF,CLASS_PALADIN,30,50,1,0,30},
  3341.         {RACE_DWARF,CLASS_PALADIN,31,52,1,0,31},
  3342.         {RACE_DWARF,CLASS_PALADIN,32,54,1,0,32},
  3343.         {RACE_DWARF,CLASS_PALADIN,33,56,1,0,33},
  3344.         {RACE_DWARF,CLASS_PALADIN,34,58,1,0,34},
  3345.         {RACE_DWARF,CLASS_PALADIN,35,60,1,0,35},
  3346.         {RACE_DWARF,CLASS_PALADIN,36,61,1,0,36},
  3347.         {RACE_DWARF,CLASS_PALADIN,37,63,1,0,37},
  3348.         {RACE_DWARF,CLASS_PALADIN,38,65,1,0,38},
  3349.         {RACE_DWARF,CLASS_PALADIN,39,67,1,0,39},
  3350.         {RACE_DWARF,CLASS_PALADIN,40,69,1,0,40},
  3351.         {RACE_DWARF,CLASS_PALADIN,41,70,1,0,41},
  3352.         {RACE_DWARF,CLASS_PALADIN,42,72,1,0,42},
  3353.         {RACE_DWARF,CLASS_PALADIN,43,73,1,0,43},
  3354.         {RACE_DWARF,CLASS_PALADIN,44,75,1,0,44},
  3355.         {RACE_DWARF,CLASS_PALADIN,45,76,1,0,45},
  3356.         {RACE_DWARF,CLASS_PALADIN,46,78,1,0,46},
  3357.         {RACE_DWARF,CLASS_PALADIN,47,80,1,0,47},
  3358.         {RACE_DWARF,CLASS_PALADIN,48,82,1,0,48},
  3359.         {RACE_DWARF,CLASS_PALADIN,49,84,1,0,49},
  3360.         {RACE_DWARF,CLASS_PALADIN,50,86,1,0,50},
  3361.         {RACE_DWARF,CLASS_PALADIN,51,88,1,0,51},
  3362.         {RACE_DROW,CLASS_WARRIOR,0,0,0,0,0},
  3363.         {RACE_DROW,CLASS_WARRIOR,1,0,0,0,0},
  3364.         {RACE_DROW,CLASS_WARRIOR,2,0,0,0,0},
  3365.         {RACE_DROW,CLASS_WARRIOR,3,0,0,0,0},
  3366.         {RACE_DROW,CLASS_WARRIOR,4,0,0,0,0},
  3367.         {RACE_DROW,CLASS_WARRIOR,5,0,0,0,0},
  3368.         {RACE_DROW,CLASS_WARRIOR,6,1,0,0,0},
  3369.         {RACE_DROW,CLASS_WARRIOR,7,1,0,0,0},
  3370.         {RACE_DROW,CLASS_WARRIOR,8,1,0,0,0},
  3371.         {RACE_DROW,CLASS_WARRIOR,9,0,0,0,0},
  3372.         {RACE_DROW,CLASS_WARRIOR,10,0,0,0,0},
  3373.         {RACE_DROW,CLASS_WARRIOR,11,0,0,0,0},
  3374.         {RACE_DROW,CLASS_WARRIOR,12,0,0,0,0},
  3375.         {RACE_DROW,CLASS_WARRIOR,13,0,0,0,0},
  3376.         {RACE_DROW,CLASS_WARRIOR,14,1,0,0,0},
  3377.         {RACE_DROW,CLASS_WARRIOR,15,1,0,0,0},
  3378.         {RACE_DROW,CLASS_WARRIOR,16,1,0,0,0},
  3379.         {RACE_DROW,CLASS_WARRIOR,17,0,0,0,0},
  3380.         {RACE_DROW,CLASS_WARRIOR,18,0,0,0,0},
  3381.         {RACE_DROW,CLASS_WARRIOR,19,1,0,0,0},
  3382.         {RACE_DROW,CLASS_WARRIOR,20,2,0,0,0},
  3383.         {RACE_DROW,CLASS_WARRIOR,21,2,0,0,0},
  3384.         {RACE_DROW,CLASS_WARRIOR,22,2,0,0,0},
  3385.         {RACE_DROW,CLASS_WARRIOR,23,2,0,0,0},
  3386.         {RACE_DROW,CLASS_WARRIOR,24,2,0,0,0},
  3387.         {RACE_DROW,CLASS_WARRIOR,25,2,0,0,0},
  3388.         {RACE_DROW,CLASS_WARRIOR,26,1,0,0,0},
  3389.         {RACE_DROW,CLASS_WARRIOR,27,1,0,0,0},
  3390.         {RACE_DROW,CLASS_WARRIOR,28,1,0,0,0},
  3391.         {RACE_DROW,CLASS_WARRIOR,29,2,0,0,0},
  3392.         {RACE_DROW,CLASS_WARRIOR,30,1,0,0,0},
  3393.         {RACE_DROW,CLASS_WARRIOR,31,1,0,0,0},
  3394.         {RACE_DROW,CLASS_WARRIOR,32,2,0,0,0},
  3395.         {RACE_DROW,CLASS_WARRIOR,33,3,0,0,0},
  3396.         {RACE_DROW,CLASS_WARRIOR,34,3,0,0,0},
  3397.         {RACE_DROW,CLASS_WARRIOR,35,3,0,0,0},
  3398.         {RACE_DROW,CLASS_WARRIOR,36,3,0,0,0},
  3399.         {RACE_DROW,CLASS_WARRIOR,37,3,0,0,0},
  3400.         {RACE_DROW,CLASS_WARRIOR,38,3,0,0,0},
  3401.         {RACE_DROW,CLASS_WARRIOR,39,4,0,0,0},
  3402.         {RACE_DROW,CLASS_WARRIOR,40,3,0,0,0},
  3403.         {RACE_DROW,CLASS_WARRIOR,41,3,0,0,0},
  3404.         {RACE_DROW,CLASS_WARRIOR,42,3,0,0,0},
  3405.         {RACE_DROW,CLASS_WARRIOR,43,3,0,0,0},
  3406.         {RACE_DROW,CLASS_WARRIOR,44,2,0,0,0},
  3407.         {RACE_DROW,CLASS_WARRIOR,45,1,0,0,0},
  3408.         {RACE_DROW,CLASS_WARRIOR,46,1,0,0,0},
  3409.         {RACE_DROW,CLASS_WARRIOR,47,2,0,0,0},
  3410.         {RACE_DROW,CLASS_WARRIOR,48,2,0,0,0},
  3411.         {RACE_DROW,CLASS_WARRIOR,49,2,0,0,0},
  3412.         {RACE_DROW,CLASS_WARRIOR,50,3,0,0,0},
  3413.         {RACE_DROW,CLASS_WARRIOR,51,3,0,0,0},
  3414.         {RACE_DROW,CLASS_NECROMANT,0,0,0,0,0},
  3415.         {RACE_DROW,CLASS_NECROMANT,1,0,0,0,0},
  3416.         {RACE_DROW,CLASS_NECROMANT,2,0,0,0,0},
  3417.         {RACE_DROW,CLASS_NECROMANT,3,0,1,0,0},
  3418.         {RACE_DROW,CLASS_NECROMANT,4,0,1,0,0},
  3419.         {RACE_DROW,CLASS_NECROMANT,5,0,1,0,0},
  3420.         {RACE_DROW,CLASS_NECROMANT,6,0,1,0,0},
  3421.         {RACE_DROW,CLASS_NECROMANT,7,0,2,0,0},
  3422.         {RACE_DROW,CLASS_NECROMANT,8,0,2,0,0},
  3423.         {RACE_DROW,CLASS_NECROMANT,9,0,1,0,0},
  3424.         {RACE_DROW,CLASS_NECROMANT,10,0,1,0,0},
  3425.         {RACE_DROW,CLASS_NECROMANT,11,0,2,0,0},
  3426.         {RACE_DROW,CLASS_NECROMANT,12,0,3,0,0},
  3427.         {RACE_DROW,CLASS_NECROMANT,13,0,2,0,0},
  3428.         {RACE_DROW,CLASS_NECROMANT,14,0,2,0,0},
  3429.         {RACE_DROW,CLASS_NECROMANT,15,0,2,0,0},
  3430.         {RACE_DROW,CLASS_NECROMANT,16,0,3,0,0},
  3431.         {RACE_DROW,CLASS_NECROMANT,17,0,3,0,0},
  3432.         {RACE_DROW,CLASS_NECROMANT,18,0,4,0,0},
  3433.         {RACE_DROW,CLASS_NECROMANT,19,0,4,0,0},
  3434.         {RACE_DROW,CLASS_NECROMANT,20,0,3,0,0},
  3435.         {RACE_DROW,CLASS_NECROMANT,21,0,2,0,0},
  3436.         {RACE_DROW,CLASS_NECROMANT,22,0,2,0,0},
  3437.         {RACE_DROW,CLASS_NECROMANT,23,0,1,0,0},
  3438.         {RACE_DROW,CLASS_NECROMANT,24,0,1,0,0},
  3439.         {RACE_DROW,CLASS_NECROMANT,25,0,1,0,0},
  3440.         {RACE_DROW,CLASS_NECROMANT,26,0,2,0,0},
  3441.         {RACE_DROW,CLASS_NECROMANT,27,0,2,0,0},
  3442.         {RACE_DROW,CLASS_NECROMANT,28,0,2,0,0},
  3443.         {RACE_DROW,CLASS_NECROMANT,29,0,2,0,0},
  3444.         {RACE_DROW,CLASS_NECROMANT,30,0,1,0,0},
  3445.         {RACE_DROW,CLASS_NECROMANT,31,0,1,0,0},
  3446.         {RACE_DROW,CLASS_NECROMANT,32,0,1,0,0},
  3447.         {RACE_DROW,CLASS_NECROMANT,33,0,1,0,0},
  3448.         {RACE_DROW,CLASS_NECROMANT,34,0,0,0,0},
  3449.         {RACE_DROW,CLASS_NECROMANT,35,0,0,0,0},
  3450.         {RACE_DROW,CLASS_NECROMANT,36,0,1,0,0},
  3451.         {RACE_DROW,CLASS_NECROMANT,37,0,0,0,0},
  3452.         {RACE_DROW,CLASS_NECROMANT,38,0,0,0,0},
  3453.         {RACE_DROW,CLASS_NECROMANT,39,0,1,0,0},
  3454.         {RACE_DROW,CLASS_NECROMANT,40,0,0,0,0},
  3455.         {RACE_DROW,CLASS_NECROMANT,41,0,0,0,0},
  3456.         {RACE_DROW,CLASS_NECROMANT,42,0,1,0,0},
  3457.         {RACE_DROW,CLASS_NECROMANT,43,0,1,0,0},
  3458.         {RACE_DROW,CLASS_NECROMANT,44,0,2,0,0},
  3459.         {RACE_DROW,CLASS_NECROMANT,45,0,2,0,0},
  3460.         {RACE_DROW,CLASS_NECROMANT,46,0,2,0,0},
  3461.         {RACE_DROW,CLASS_NECROMANT,47,0,2,0,0},
  3462.         {RACE_DROW,CLASS_NECROMANT,48,0,2,0,0},
  3463.         {RACE_DROW,CLASS_NECROMANT,49,0,2,0,0},
  3464.         {RACE_DROW,CLASS_NECROMANT,50,0,2,0,0},
  3465.         {RACE_DROW,CLASS_NECROMANT,51,0,1,0,0},
  3466.         {RACE_DROW,CLASS_DRUID,0,0,0,0,0},
  3467.         {RACE_DROW,CLASS_DRUID,1,0,1,0,0},
  3468.         {RACE_DROW,CLASS_DRUID,2,0,2,0,0},
  3469.         {RACE_DROW,CLASS_DRUID,3,1,3,0,0},
  3470.         {RACE_DROW,CLASS_DRUID,4,1,4,0,0},
  3471.         {RACE_DROW,CLASS_DRUID,5,1,5,0,0},
  3472.         {RACE_DROW,CLASS_DRUID,6,1,6,0,0},
  3473.         {RACE_DROW,CLASS_DRUID,7,1,6,0,0},
  3474.         {RACE_DROW,CLASS_DRUID,8,1,7,0,0},
  3475.         {RACE_DROW,CLASS_DRUID,9,1,8,0,0},
  3476.         {RACE_DROW,CLASS_DRUID,10,2,8,0,0},
  3477.         {RACE_DROW,CLASS_DRUID,11,1,9,0,0},
  3478.         {RACE_DROW,CLASS_DRUID,12,2,9,0,0},
  3479.         {RACE_DROW,CLASS_DRUID,13,2,9,0,0},
  3480.         {RACE_DROW,CLASS_DRUID,14,2,10,0,0},
  3481.         {RACE_DROW,CLASS_DRUID,15,3,10,0,0},
  3482.         {RACE_DROW,CLASS_DRUID,16,2,10,0,0},
  3483.         {RACE_DROW,CLASS_DRUID,17,2,11,0,0},
  3484.         {RACE_DROW,CLASS_DRUID,18,2,11,0,0},
  3485.         {RACE_DROW,CLASS_DRUID,19,2,11,0,0},
  3486.         {RACE_DROW,CLASS_DRUID,20,2,11,0,0},
  3487.         {RACE_DROW,CLASS_DRUID,21,3,11,0,0},
  3488.         {RACE_DROW,CLASS_DRUID,22,3,11,0,0},
  3489.         {RACE_DROW,CLASS_DRUID,23,4,12,0,0},
  3490.         {RACE_DROW,CLASS_DRUID,24,4,13,0,0},
  3491.         {RACE_DROW,CLASS_DRUID,25,3,14,0,0},
  3492.         {RACE_DROW,CLASS_DRUID,26,4,15,0,0},
  3493.         {RACE_DROW,CLASS_DRUID,27,4,16,0,0},
  3494.         {RACE_DROW,CLASS_DRUID,28,3,16,0,0},
  3495.         {RACE_DROW,CLASS_DRUID,29,3,16,0,0},
  3496.         {RACE_DROW,CLASS_DRUID,30,3,16,0,0},
  3497.         {RACE_DROW,CLASS_DRUID,31,3,17,0,0},
  3498.         {RACE_DROW,CLASS_DRUID,32,2,17,0,0},
  3499.         {RACE_DROW,CLASS_DRUID,33,2,17,0,0},
  3500.         {RACE_DROW,CLASS_DRUID,34,1,17,0,0},
  3501.         {RACE_DROW,CLASS_DRUID,35,1,17,0,0},
  3502.         {RACE_DROW,CLASS_DRUID,36,2,17,0,0},
  3503.         {RACE_DROW,CLASS_DRUID,37,2,18,0,0},
  3504.         {RACE_DROW,CLASS_DRUID,38,1,18,0,0},
  3505.         {RACE_DROW,CLASS_DRUID,39,0,19,0,0},
  3506.         {RACE_DROW,CLASS_DRUID,40,0,20,0,0},
  3507.         {RACE_DROW,CLASS_DRUID,41,0,21,0,0},
  3508.         {RACE_DROW,CLASS_DRUID,42,0,22,0,0},
  3509.         {RACE_DROW,CLASS_DRUID,43,0,23,0,0},
  3510.         {RACE_DROW,CLASS_DRUID,44,0,24,0,0},
  3511.         {RACE_DROW,CLASS_DRUID,45,1,24,0,0},
  3512.         {RACE_DROW,CLASS_DRUID,46,1,25,0,0},
  3513.         {RACE_DROW,CLASS_DRUID,47,1,25,0,0},
  3514.         {RACE_DROW,CLASS_DRUID,48,1,25,0,0},
  3515.         {RACE_DROW,CLASS_DRUID,49,1,26,0,0},
  3516.         {RACE_DROW,CLASS_DRUID,50,0,27,0,0},
  3517.         {RACE_DROW,CLASS_DRUID,51,0,28,0,0},
  3518.         {RACE_DROW,CLASS_CLERIC,0,0,0,0,0},
  3519.         {RACE_DROW,CLASS_CLERIC,1,1,1,0,0},
  3520.         {RACE_DROW,CLASS_CLERIC,2,1,3,0,0},
  3521.         {RACE_DROW,CLASS_CLERIC,3,2,4,0,0},
  3522.         {RACE_DROW,CLASS_CLERIC,4,3,6,0,0},
  3523.         {RACE_DROW,CLASS_CLERIC,5,3,8,0,0},
  3524.         {RACE_DROW,CLASS_CLERIC,6,3,10,0,0},
  3525.         {RACE_DROW,CLASS_CLERIC,7,4,12,0,0},
  3526.         {RACE_DROW,CLASS_CLERIC,8,4,14,0,0},
  3527.         {RACE_DROW,CLASS_CLERIC,9,4,15,0,0},
  3528.         {RACE_DROW,CLASS_CLERIC,10,5,17,0,0},
  3529.         {RACE_DROW,CLASS_CLERIC,11,4,18,0,0},
  3530.         {RACE_DROW,CLASS_CLERIC,12,4,19,0,0},
  3531.         {RACE_DROW,CLASS_CLERIC,13,4,19,0,0},
  3532.         {RACE_DROW,CLASS_CLERIC,14,4,20,0,0},
  3533.         {RACE_DROW,CLASS_CLERIC,15,3,20,0,0},
  3534.         {RACE_DROW,CLASS_CLERIC,16,2,20,0,0},
  3535.         {RACE_DROW,CLASS_CLERIC,17,3,20,0,0},
  3536.         {RACE_DROW,CLASS_CLERIC,18,3,20,0,0},
  3537.         {RACE_DROW,CLASS_CLERIC,19,3,21,0,0},
  3538.         {RACE_DROW,CLASS_CLERIC,20,3,22,0,0},
  3539.         {RACE_DROW,CLASS_CLERIC,21,4,23,0,0},
  3540.         {RACE_DROW,CLASS_CLERIC,22,4,25,0,0},
  3541.         {RACE_DROW,CLASS_CLERIC,23,4,27,0,0},
  3542.         {RACE_DROW,CLASS_CLERIC,24,5,28,0,0},
  3543.         {RACE_DROW,CLASS_CLERIC,25,5,28,0,0},
  3544.         {RACE_DROW,CLASS_CLERIC,26,5,29,0,0},
  3545.         {RACE_DROW,CLASS_CLERIC,27,5,30,0,0},
  3546.         {RACE_DROW,CLASS_CLERIC,28,5,31,0,0},
  3547.         {RACE_DROW,CLASS_CLERIC,29,4,33,0,0},
  3548.         {RACE_DROW,CLASS_CLERIC,30,4,34,0,0},
  3549.         {RACE_DROW,CLASS_CLERIC,31,3,35,0,0},
  3550.         {RACE_DROW,CLASS_CLERIC,32,3,36,0,0},
  3551.         {RACE_DROW,CLASS_CLERIC,33,2,37,0,0},
  3552.         {RACE_DROW,CLASS_CLERIC,34,1,38,0,0},
  3553.         {RACE_DROW,CLASS_CLERIC,35,0,38,0,0},
  3554.         {RACE_DROW,CLASS_CLERIC,36,0,40,0,0},
  3555.         {RACE_DROW,CLASS_CLERIC,37,1,42,0,0},
  3556.         {RACE_DROW,CLASS_CLERIC,38,2,44,0,0},
  3557.         {RACE_DROW,CLASS_CLERIC,39,3,44,0,0},
  3558.         {RACE_DROW,CLASS_CLERIC,40,3,44,0,0},
  3559.         {RACE_DROW,CLASS_CLERIC,41,2,44,0,0},
  3560.         {RACE_DROW,CLASS_CLERIC,42,2,46,0,0},
  3561.         {RACE_DROW,CLASS_CLERIC,43,2,47,0,0},
  3562.         {RACE_DROW,CLASS_CLERIC,44,2,48,0,0},
  3563.         {RACE_DROW,CLASS_CLERIC,45,3,49,0,0},
  3564.         {RACE_DROW,CLASS_CLERIC,46,4,49,0,0},
  3565.         {RACE_DROW,CLASS_CLERIC,47,4,50,0,0},
  3566.         {RACE_DROW,CLASS_CLERIC,48,4,50,0,0},
  3567.         {RACE_DROW,CLASS_CLERIC,49,4,52,0,0},
  3568.         {RACE_DROW,CLASS_CLERIC,50,5,53,0,0},
  3569.         {RACE_DROW,CLASS_CLERIC,51,5,54,0,0},
  3570.         {RACE_DROW,CLASS_THIEF,0,0,0,0,0},
  3571.         {RACE_DROW,CLASS_THIEF,1,0,0,0,0},
  3572.         {RACE_DROW,CLASS_THIEF,2,0,0,0,0},
  3573.         {RACE_DROW,CLASS_THIEF,3,0,0,0,0},
  3574.         {RACE_DROW,CLASS_THIEF,4,0,0,0,0},
  3575.         {RACE_DROW,CLASS_THIEF,5,0,0,0,0},
  3576.         {RACE_DROW,CLASS_THIEF,6,0,0,0,0},
  3577.         {RACE_DROW,CLASS_THIEF,7,0,0,0,0},
  3578.         {RACE_DROW,CLASS_THIEF,8,0,0,0,0},
  3579.         {RACE_DROW,CLASS_THIEF,9,0,0,0,0},
  3580.         {RACE_DROW,CLASS_THIEF,10,0,0,0,0},
  3581.         {RACE_DROW,CLASS_THIEF,11,0,0,0,0},
  3582.         {RACE_DROW,CLASS_THIEF,12,0,0,0,0},
  3583.         {RACE_DROW,CLASS_THIEF,13,0,0,0,0},
  3584.         {RACE_DROW,CLASS_THIEF,14,0,0,0,0},
  3585.         {RACE_DROW,CLASS_THIEF,15,0,0,0,0},
  3586.         {RACE_DROW,CLASS_THIEF,16,0,0,0,0},
  3587.         {RACE_DROW,CLASS_THIEF,17,0,0,0,0},
  3588.         {RACE_DROW,CLASS_THIEF,18,0,0,0,0},
  3589.         {RACE_DROW,CLASS_THIEF,19,0,0,0,0},
  3590.         {RACE_DROW,CLASS_THIEF,20,0,0,0,0},
  3591.         {RACE_DROW,CLASS_THIEF,21,0,0,0,0},
  3592.         {RACE_DROW,CLASS_THIEF,22,0,0,0,0},
  3593.         {RACE_DROW,CLASS_THIEF,23,0,0,0,0},
  3594.         {RACE_DROW,CLASS_THIEF,24,0,0,0,0},
  3595.         {RACE_DROW,CLASS_THIEF,25,0,0,0,0},
  3596.         {RACE_DROW,CLASS_THIEF,26,0,0,0,0},
  3597.         {RACE_DROW,CLASS_THIEF,27,0,0,0,0},
  3598.         {RACE_DROW,CLASS_THIEF,28,0,0,0,0},
  3599.         {RACE_DROW,CLASS_THIEF,29,0,0,0,0},
  3600.         {RACE_DROW,CLASS_THIEF,30,0,0,0,0},
  3601.         {RACE_DROW,CLASS_THIEF,31,0,0,0,0},
  3602.         {RACE_DROW,CLASS_THIEF,32,0,0,0,0},
  3603.         {RACE_DROW,CLASS_THIEF,33,0,0,0,0},
  3604.         {RACE_DROW,CLASS_THIEF,34,0,0,0,0},
  3605.         {RACE_DROW,CLASS_THIEF,35,0,0,0,0},
  3606.         {RACE_DROW,CLASS_THIEF,36,0,0,0,0},
  3607.         {RACE_DROW,CLASS_THIEF,37,0,0,0,0},
  3608.         {RACE_DROW,CLASS_THIEF,38,0,0,0,0},
  3609.         {RACE_DROW,CLASS_THIEF,39,0,0,0,0},
  3610.         {RACE_DROW,CLASS_THIEF,40,0,0,0,0},
  3611.         {RACE_DROW,CLASS_THIEF,41,0,0,0,0},
  3612.         {RACE_DROW,CLASS_THIEF,42,0,0,0,0},
  3613.         {RACE_DROW,CLASS_THIEF,43,0,0,0,0},
  3614.         {RACE_DROW,CLASS_THIEF,44,0,0,0,0},
  3615.         {RACE_DROW,CLASS_THIEF,45,0,0,0,0},
  3616.         {RACE_DROW,CLASS_THIEF,46,0,0,0,0},
  3617.         {RACE_DROW,CLASS_THIEF,47,0,0,0,0},
  3618.         {RACE_DROW,CLASS_THIEF,48,0,0,0,0},
  3619.         {RACE_DROW,CLASS_THIEF,49,0,0,0,0},
  3620.         {RACE_DROW,CLASS_THIEF,50,0,0,0,0},
  3621.         {RACE_DROW,CLASS_THIEF,51,0,0,0,0},
  3622.         {RACE_DROW,CLASS_RANGER,0,0,0,0,0},
  3623.         {RACE_DROW,CLASS_RANGER,1,0,0,0,0},
  3624.         {RACE_DROW,CLASS_RANGER,2,0,0,0,0},
  3625.         {RACE_DROW,CLASS_RANGER,3,0,0,0,0},
  3626.         {RACE_DROW,CLASS_RANGER,4,0,0,0,0},
  3627.         {RACE_DROW,CLASS_RANGER,5,0,0,0,0},
  3628.         {RACE_DROW,CLASS_RANGER,6,0,0,0,0},
  3629.         {RACE_DROW,CLASS_RANGER,7,0,0,0,0},
  3630.         {RACE_DROW,CLASS_RANGER,8,0,0,0,0},
  3631.         {RACE_DROW,CLASS_RANGER,9,0,0,0,0},
  3632.         {RACE_DROW,CLASS_RANGER,10,0,0,0,0},
  3633.         {RACE_DROW,CLASS_RANGER,11,0,0,0,0},
  3634.         {RACE_DROW,CLASS_RANGER,12,0,0,0,0},
  3635.         {RACE_DROW,CLASS_RANGER,13,0,0,0,0},
  3636.         {RACE_DROW,CLASS_RANGER,14,0,0,0,0},
  3637.         {RACE_DROW,CLASS_RANGER,15,0,0,0,0},
  3638.         {RACE_DROW,CLASS_RANGER,16,0,0,0,0},
  3639.         {RACE_DROW,CLASS_RANGER,17,0,0,0,0},
  3640.         {RACE_DROW,CLASS_RANGER,18,0,0,0,0},
  3641.         {RACE_DROW,CLASS_RANGER,19,0,0,0,0},
  3642.         {RACE_DROW,CLASS_RANGER,20,0,0,0,0},
  3643.         {RACE_DROW,CLASS_RANGER,21,0,0,0,0},
  3644.         {RACE_DROW,CLASS_RANGER,22,0,0,0,0},
  3645.         {RACE_DROW,CLASS_RANGER,23,0,0,0,0},
  3646.         {RACE_DROW,CLASS_RANGER,24,0,0,0,0},
  3647.         {RACE_DROW,CLASS_RANGER,25,0,0,0,0},
  3648.         {RACE_DROW,CLASS_RANGER,26,0,0,0,0},
  3649.         {RACE_DROW,CLASS_RANGER,27,0,0,0,0},
  3650.         {RACE_DROW,CLASS_RANGER,28,0,0,0,0},
  3651.         {RACE_DROW,CLASS_RANGER,29,0,0,0,0},
  3652.         {RACE_DROW,CLASS_RANGER,30,0,0,0,0},
  3653.         {RACE_DROW,CLASS_RANGER,31,0,0,0,0},
  3654.         {RACE_DROW,CLASS_RANGER,32,0,0,0,0},
  3655.         {RACE_DROW,CLASS_RANGER,33,0,0,0,0},
  3656.         {RACE_DROW,CLASS_RANGER,34,0,0,0,0},
  3657.         {RACE_DROW,CLASS_RANGER,35,0,0,0,0},
  3658.         {RACE_DROW,CLASS_RANGER,36,0,0,0,0},
  3659.         {RACE_DROW,CLASS_RANGER,37,0,0,0,0},
  3660.         {RACE_DROW,CLASS_RANGER,38,0,0,0,0},
  3661.         {RACE_DROW,CLASS_RANGER,39,0,0,0,0},
  3662.         {RACE_DROW,CLASS_RANGER,40,0,0,0,0},
  3663.         {RACE_DROW,CLASS_RANGER,41,0,0,0,0},
  3664.         {RACE_DROW,CLASS_RANGER,42,0,0,0,0},
  3665.         {RACE_DROW,CLASS_RANGER,43,0,0,0,0},
  3666.         {RACE_DROW,CLASS_RANGER,44,0,0,0,0},
  3667.         {RACE_DROW,CLASS_RANGER,45,0,0,0,0},
  3668.         {RACE_DROW,CLASS_RANGER,46,0,0,0,0},
  3669.         {RACE_DROW,CLASS_RANGER,47,0,0,0,0},
  3670.         {RACE_DROW,CLASS_RANGER,48,0,0,0,0},
  3671.         {RACE_DROW,CLASS_RANGER,49,0,0,0,0},
  3672.         {RACE_DROW,CLASS_RANGER,50,0,0,0,0},
  3673.         {RACE_DROW,CLASS_RANGER,51,0,0,0,0},
  3674.         {RACE_DROW,CLASS_NAZGUL,0,0,0,0,0},
  3675.         {RACE_DROW,CLASS_NAZGUL,1,0,0,0,0},
  3676.         {RACE_DROW,CLASS_NAZGUL,2,0,1,0,0},
  3677.         {RACE_DROW,CLASS_NAZGUL,3,0,1,0,0},
  3678.         {RACE_DROW,CLASS_NAZGUL,4,0,2,0,0},
  3679.         {RACE_DROW,CLASS_NAZGUL,5,0,3,0,0},
  3680.         {RACE_DROW,CLASS_NAZGUL,6,0,4,0,0},
  3681.         {RACE_DROW,CLASS_NAZGUL,7,0,4,0,0},
  3682.         {RACE_DROW,CLASS_NAZGUL,8,0,4,0,0},
  3683.         {RACE_DROW,CLASS_NAZGUL,9,0,4,0,0},
  3684.         {RACE_DROW,CLASS_NAZGUL,10,0,4,0,0},
  3685.         {RACE_DROW,CLASS_NAZGUL,11,0,5,0,0},
  3686.         {RACE_DROW,CLASS_NAZGUL,12,0,6,0,0},
  3687.         {RACE_DROW,CLASS_NAZGUL,13,0,6,0,0},
  3688.         {RACE_DROW,CLASS_NAZGUL,14,0,6,0,0},
  3689.         {RACE_DROW,CLASS_NAZGUL,15,0,6,0,0},
  3690.         {RACE_DROW,CLASS_NAZGUL,16,0,7,0,0},
  3691.         {RACE_DROW,CLASS_NAZGUL,17,0,7,0,0},
  3692.         {RACE_DROW,CLASS_NAZGUL,18,0,7,0,0},
  3693.         {RACE_DROW,CLASS_NAZGUL,19,0,7,0,0},
  3694.         {RACE_DROW,CLASS_NAZGUL,20,0,7,0,0},
  3695.         {RACE_DROW,CLASS_NAZGUL,21,0,7,0,0},
  3696.         {RACE_DROW,CLASS_NAZGUL,22,0,7,0,0},
  3697.         {RACE_DROW,CLASS_NAZGUL,23,0,7,0,0},
  3698.         {RACE_DROW,CLASS_NAZGUL,24,0,7,0,0},
  3699.         {RACE_DROW,CLASS_NAZGUL,25,0,7,0,0},
  3700.         {RACE_DROW,CLASS_NAZGUL,26,0,7,0,0},
  3701.         {RACE_DROW,CLASS_NAZGUL,27,0,7,0,0},
  3702.         {RACE_DROW,CLASS_NAZGUL,28,0,8,0,0},
  3703.         {RACE_DROW,CLASS_NAZGUL,29,0,8,0,0},
  3704.         {RACE_DROW,CLASS_NAZGUL,30,0,8,0,0},
  3705.         {RACE_DROW,CLASS_NAZGUL,31,0,8,0,0},
  3706.         {RACE_DROW,CLASS_NAZGUL,32,0,9,0,0},
  3707.         {RACE_DROW,CLASS_NAZGUL,33,0,10,0,0},
  3708.         {RACE_DROW,CLASS_NAZGUL,34,0,11,0,0},
  3709.         {RACE_DROW,CLASS_NAZGUL,35,0,12,0,0},
  3710.         {RACE_DROW,CLASS_NAZGUL,36,0,12,0,0},
  3711.         {RACE_DROW,CLASS_NAZGUL,37,0,13,0,0},
  3712.         {RACE_DROW,CLASS_NAZGUL,38,0,13,0,0},
  3713.         {RACE_DROW,CLASS_NAZGUL,39,0,14,0,0},
  3714.         {RACE_DROW,CLASS_NAZGUL,40,0,15,0,0},
  3715.         {RACE_DROW,CLASS_NAZGUL,41,0,15,0,0},
  3716.         {RACE_DROW,CLASS_NAZGUL,42,0,16,0,0},
  3717.         {RACE_DROW,CLASS_NAZGUL,43,0,16,0,0},
  3718.         {RACE_DROW,CLASS_NAZGUL,44,0,17,0,0},
  3719.         {RACE_DROW,CLASS_NAZGUL,45,0,17,0,0},
  3720.         {RACE_DROW,CLASS_NAZGUL,46,0,17,0,0},
  3721.         {RACE_DROW,CLASS_NAZGUL,47,0,18,0,0},
  3722.         {RACE_DROW,CLASS_NAZGUL,48,0,19,0,0},
  3723.         {RACE_DROW,CLASS_NAZGUL,49,0,19,0,0},
  3724.         {RACE_DROW,CLASS_NAZGUL,50,0,19,0,0},
  3725.         {RACE_DROW,CLASS_NAZGUL,51,0,20,0,0},
  3726.         {RACE_DROW,CLASS_MAGE,0,0,0,0,0},
  3727.         {RACE_DROW,CLASS_MAGE,1,0,0,0,0},
  3728.         {RACE_DROW,CLASS_MAGE,2,0,0,0,0},
  3729.         {RACE_DROW,CLASS_MAGE,3,1,0,0,0},
  3730.         {RACE_DROW,CLASS_MAGE,4,1,1,0,0},
  3731.         {RACE_DROW,CLASS_MAGE,5,0,2,0,0},
  3732.         {RACE_DROW,CLASS_MAGE,6,0,2,0,0},
  3733.         {RACE_DROW,CLASS_MAGE,7,1,3,0,0},
  3734.         {RACE_DROW,CLASS_MAGE,8,2,3,0,0},
  3735.         {RACE_DROW,CLASS_MAGE,9,2,4,0,0},
  3736.         {RACE_DROW,CLASS_MAGE,10,2,4,0,0},
  3737.         {RACE_DROW,CLASS_MAGE,11,1,3,0,0},
  3738.         {RACE_DROW,CLASS_MAGE,12,1,3,0,0},
  3739.         {RACE_DROW,CLASS_MAGE,13,2,2,0,0},
  3740.         {RACE_DROW,CLASS_MAGE,14,2,2,0,0},
  3741.         {RACE_DROW,CLASS_MAGE,15,2,2,0,0},
  3742.         {RACE_DROW,CLASS_MAGE,16,1,2,0,0},
  3743.         {RACE_DROW,CLASS_MAGE,17,1,1,0,0},
  3744.         {RACE_DROW,CLASS_MAGE,18,2,2,0,0},
  3745.         {RACE_DROW,CLASS_MAGE,19,2,3,0,0},
  3746.         {RACE_DROW,CLASS_MAGE,20,3,4,0,0},
  3747.         {RACE_DROW,CLASS_MAGE,21,4,3,0,0},
  3748.         {RACE_DROW,CLASS_MAGE,22,4,3,0,0},
  3749.         {RACE_DROW,CLASS_MAGE,23,4,3,0,0},
  3750.         {RACE_DROW,CLASS_MAGE,24,5,2,0,0},
  3751.         {RACE_DROW,CLASS_MAGE,25,4,3,0,0},
  3752.         {RACE_DROW,CLASS_MAGE,26,5,2,0,0},
  3753.         {RACE_DROW,CLASS_MAGE,27,4,2,0,0},
  3754.         {RACE_DROW,CLASS_MAGE,28,4,2,0,0},
  3755.         {RACE_DROW,CLASS_MAGE,29,3,2,0,0},
  3756.         {RACE_DROW,CLASS_MAGE,30,3,2,0,0},
  3757.         {RACE_DROW,CLASS_MAGE,31,3,2,0,0},
  3758.         {RACE_DROW,CLASS_MAGE,32,4,2,0,0},
  3759.         {RACE_DROW,CLASS_MAGE,33,4,1,0,0},
  3760.         {RACE_DROW,CLASS_MAGE,34,4,0,0,0},
  3761.         {RACE_DROW,CLASS_MAGE,35,4,1,0,0},
  3762.         {RACE_DROW,CLASS_MAGE,36,5,1,0,0},
  3763.         {RACE_DROW,CLASS_MAGE,37,5,1,0,0},
  3764.         {RACE_DROW,CLASS_MAGE,38,5,1,0,0},
  3765.         {RACE_DROW,CLASS_MAGE,39,5,1,0,0},
  3766.         {RACE_DROW,CLASS_MAGE,40,6,0,0,0},
  3767.         {RACE_DROW,CLASS_MAGE,41,5,1,0,0},
  3768.         {RACE_DROW,CLASS_MAGE,42,5,1,0,0},
  3769.         {RACE_DROW,CLASS_MAGE,43,5,1,0,0},
  3770.         {RACE_DROW,CLASS_MAGE,44,5,2,0,0},
  3771.         {RACE_DROW,CLASS_MAGE,45,5,2,0,0},
  3772.         {RACE_DROW,CLASS_MAGE,46,5,3,0,0},
  3773.         {RACE_DROW,CLASS_MAGE,47,6,3,0,0},
  3774.         {RACE_DROW,CLASS_MAGE,48,6,4,0,0},
  3775.         {RACE_DROW,CLASS_MAGE,49,6,5,0,0},
  3776.         {RACE_DROW,CLASS_MAGE,50,6,5,0,0},
  3777.         {RACE_DROW,CLASS_MAGE,51,6,4,0,0},
  3778.         {RACE_DROW,CLASS_ALCHEMIST,0,0,0,0,0},
  3779.         {RACE_DROW,CLASS_ALCHEMIST,1,0,1,0,0},
  3780.         {RACE_DROW,CLASS_ALCHEMIST,2,0,2,0,0},
  3781.         {RACE_DROW,CLASS_ALCHEMIST,3,0,2,0,0},
  3782.         {RACE_DROW,CLASS_ALCHEMIST,4,0,2,0,0},
  3783.         {RACE_DROW,CLASS_ALCHEMIST,5,0,2,0,0},
  3784.         {RACE_DROW,CLASS_ALCHEMIST,6,0,2,0,0},
  3785.         {RACE_DROW,CLASS_ALCHEMIST,7,0,2,0,0},
  3786.         {RACE_DROW,CLASS_ALCHEMIST,8,0,3,0,0},
  3787.         {RACE_DROW,CLASS_ALCHEMIST,9,0,3,0,0},
  3788.         {RACE_DROW,CLASS_ALCHEMIST,10,0,4,0,0},
  3789.         {RACE_DROW,CLASS_ALCHEMIST,11,0,5,0,0},
  3790.         {RACE_DROW,CLASS_ALCHEMIST,12,0,6,0,0},
  3791.         {RACE_DROW,CLASS_ALCHEMIST,13,0,7,0,0},
  3792.         {RACE_DROW,CLASS_ALCHEMIST,14,0,8,0,0},
  3793.         {RACE_DROW,CLASS_ALCHEMIST,15,0,9,0,0},
  3794.         {RACE_DROW,CLASS_ALCHEMIST,16,0,9,0,0},
  3795.         {RACE_DROW,CLASS_ALCHEMIST,17,0,9,0,0},
  3796.         {RACE_DROW,CLASS_ALCHEMIST,18,0,10,0,0},
  3797.         {RACE_DROW,CLASS_ALCHEMIST,19,0,10,0,0},
  3798.         {RACE_DROW,CLASS_ALCHEMIST,20,0,10,0,0},
  3799.         {RACE_DROW,CLASS_ALCHEMIST,21,0,11,0,0},
  3800.         {RACE_DROW,CLASS_ALCHEMIST,22,0,11,0,0},
  3801.         {RACE_DROW,CLASS_ALCHEMIST,23,0,11,0,0},
  3802.         {RACE_DROW,CLASS_ALCHEMIST,24,0,12,0,0},
  3803.         {RACE_DROW,CLASS_ALCHEMIST,25,0,13,0,0},
  3804.         {RACE_DROW,CLASS_ALCHEMIST,26,0,14,0,0},
  3805.         {RACE_DROW,CLASS_ALCHEMIST,27,0,14,0,0},
  3806.         {RACE_DROW,CLASS_ALCHEMIST,28,0,15,0,0},
  3807.         {RACE_DROW,CLASS_ALCHEMIST,29,0,15,0,0},
  3808.         {RACE_DROW,CLASS_ALCHEMIST,30,0,16,0,0},
  3809.         {RACE_DROW,CLASS_ALCHEMIST,31,0,17,0,0},
  3810.         {RACE_DROW,CLASS_ALCHEMIST,32,0,18,0,0},
  3811.         {RACE_DROW,CLASS_ALCHEMIST,33,0,18,0,0},
  3812.         {RACE_DROW,CLASS_ALCHEMIST,34,0,18,0,0},
  3813.         {RACE_DROW,CLASS_ALCHEMIST,35,0,19,0,0},
  3814.         {RACE_DROW,CLASS_ALCHEMIST,36,0,20,0,0},
  3815.         {RACE_DROW,CLASS_ALCHEMIST,37,0,20,0,0},
  3816.         {RACE_DROW,CLASS_ALCHEMIST,38,0,20,0,0},
  3817.         {RACE_DROW,CLASS_ALCHEMIST,39,0,20,0,0},
  3818.         {RACE_DROW,CLASS_ALCHEMIST,40,0,21,0,0},
  3819.         {RACE_DROW,CLASS_ALCHEMIST,41,0,22,0,0},
  3820.         {RACE_DROW,CLASS_ALCHEMIST,42,0,22,0,0},
  3821.         {RACE_DROW,CLASS_ALCHEMIST,43,0,23,0,0},
  3822.         {RACE_DROW,CLASS_ALCHEMIST,44,0,24,0,0},
  3823.         {RACE_DROW,CLASS_ALCHEMIST,45,0,25,0,0},
  3824.         {RACE_DROW,CLASS_ALCHEMIST,46,0,26,0,0},
  3825.         {RACE_DROW,CLASS_ALCHEMIST,47,0,27,0,0},
  3826.         {RACE_DROW,CLASS_ALCHEMIST,48,0,28,0,0},
  3827.         {RACE_DROW,CLASS_ALCHEMIST,49,0,29,0,0},
  3828.         {RACE_DROW,CLASS_ALCHEMIST,50,0,30,0,0},
  3829.         {RACE_DROW,CLASS_ALCHEMIST,51,0,30,0,0},
  3830.         {RACE_ZOMBIE,CLASS_WARRIOR,0,0,0,0,0},
  3831.         {RACE_ZOMBIE,CLASS_WARRIOR,1,0,0,0,0},
  3832.         {RACE_ZOMBIE,CLASS_WARRIOR,2,0,0,0,0},
  3833.         {RACE_ZOMBIE,CLASS_WARRIOR,3,0,0,0,0},
  3834.         {RACE_ZOMBIE,CLASS_WARRIOR,4,0,0,0,0},
  3835.         {RACE_ZOMBIE,CLASS_WARRIOR,5,0,0,0,0},
  3836.         {RACE_ZOMBIE,CLASS_WARRIOR,6,1,0,0,0},
  3837.         {RACE_ZOMBIE,CLASS_WARRIOR,7,1,0,0,0},
  3838.         {RACE_ZOMBIE,CLASS_WARRIOR,8,1,0,0,0},
  3839.         {RACE_ZOMBIE,CLASS_WARRIOR,9,1,0,0,0},
  3840.         {RACE_ZOMBIE,CLASS_WARRIOR,10,1,0,0,0},
  3841.         {RACE_ZOMBIE,CLASS_WARRIOR,11,1,0,0,0},
  3842.         {RACE_ZOMBIE,CLASS_WARRIOR,12,1,0,0,0},
  3843.         {RACE_ZOMBIE,CLASS_WARRIOR,13,1,0,0,0},
  3844.         {RACE_ZOMBIE,CLASS_WARRIOR,14,1,0,0,0},
  3845.         {RACE_ZOMBIE,CLASS_WARRIOR,15,1,0,0,0},
  3846.         {RACE_ZOMBIE,CLASS_WARRIOR,16,1,0,0,0},
  3847.         {RACE_ZOMBIE,CLASS_WARRIOR,17,1,0,0,0},
  3848.         {RACE_ZOMBIE,CLASS_WARRIOR,18,1,0,0,0},
  3849.         {RACE_ZOMBIE,CLASS_WARRIOR,19,1,0,0,0},
  3850.         {RACE_ZOMBIE,CLASS_WARRIOR,20,1,0,0,0},
  3851.         {RACE_ZOMBIE,CLASS_WARRIOR,21,1,0,0,0},
  3852.         {RACE_ZOMBIE,CLASS_WARRIOR,22,2,0,0,0},
  3853.         {RACE_ZOMBIE,CLASS_WARRIOR,23,2,0,0,0},
  3854.         {RACE_ZOMBIE,CLASS_WARRIOR,24,2,0,0,0},
  3855.         {RACE_ZOMBIE,CLASS_WARRIOR,25,2,0,0,0},
  3856.         {RACE_ZOMBIE,CLASS_WARRIOR,26,2,0,0,0},
  3857.         {RACE_ZOMBIE,CLASS_WARRIOR,27,2,0,0,0},
  3858.         {RACE_ZOMBIE,CLASS_WARRIOR,28,3,0,0,0},
  3859.         {RACE_ZOMBIE,CLASS_WARRIOR,29,3,0,0,0},
  3860.         {RACE_ZOMBIE,CLASS_WARRIOR,30,3,0,0,0},
  3861.         {RACE_ZOMBIE,CLASS_WARRIOR,31,3,0,0,0},
  3862.         {RACE_ZOMBIE,CLASS_WARRIOR,32,4,0,0,0},
  3863.         {RACE_ZOMBIE,CLASS_WARRIOR,33,4,0,0,0},
  3864.         {RACE_ZOMBIE,CLASS_WARRIOR,34,4,0,0,0},
  3865.         {RACE_ZOMBIE,CLASS_WARRIOR,35,5,0,0,0},
  3866.         {RACE_ZOMBIE,CLASS_WARRIOR,36,6,0,0,0},
  3867.         {RACE_ZOMBIE,CLASS_WARRIOR,37,6,0,0,0},
  3868.         {RACE_ZOMBIE,CLASS_WARRIOR,38,7,0,0,0},
  3869.         {RACE_ZOMBIE,CLASS_WARRIOR,39,7,0,0,0},
  3870.         {RACE_ZOMBIE,CLASS_WARRIOR,40,8,0,0,0},
  3871.         {RACE_ZOMBIE,CLASS_WARRIOR,41,8,0,0,0},
  3872.         {RACE_ZOMBIE,CLASS_WARRIOR,42,9,0,0,0},
  3873.         {RACE_ZOMBIE,CLASS_WARRIOR,43,9,0,0,0},
  3874.         {RACE_ZOMBIE,CLASS_WARRIOR,44,9,0,0,0},
  3875.         {RACE_ZOMBIE,CLASS_WARRIOR,45,10,0,0,0},
  3876.         {RACE_ZOMBIE,CLASS_WARRIOR,46,10,0,0,0},
  3877.         {RACE_ZOMBIE,CLASS_WARRIOR,47,10,0,0,0},
  3878.         {RACE_ZOMBIE,CLASS_WARRIOR,48,10,0,0,0},
  3879.         {RACE_ZOMBIE,CLASS_WARRIOR,49,11,0,0,0},
  3880.         {RACE_ZOMBIE,CLASS_WARRIOR,50,12,0,0,0},
  3881.         {RACE_ZOMBIE,CLASS_WARRIOR,51,13,0,0,0},
  3882.         {RACE_ZOMBIE,CLASS_NECROMANT,0,0,0,0,0},
  3883.         {RACE_ZOMBIE,CLASS_NECROMANT,1,1,0,0,0},
  3884.         {RACE_ZOMBIE,CLASS_NECROMANT,2,2,1,0,0},
  3885.         {RACE_ZOMBIE,CLASS_NECROMANT,3,2,1,0,0},
  3886.         {RACE_ZOMBIE,CLASS_NECROMANT,4,3,2,0,0},
  3887.         {RACE_ZOMBIE,CLASS_NECROMANT,5,4,3,0,0},
  3888.         {RACE_ZOMBIE,CLASS_NECROMANT,6,6,4,0,0},
  3889.         {RACE_ZOMBIE,CLASS_NECROMANT,7,7,4,0,0},
  3890.         {RACE_ZOMBIE,CLASS_NECROMANT,8,8,4,0,0},
  3891.         {RACE_ZOMBIE,CLASS_NECROMANT,9,9,4,0,0},
  3892.         {RACE_ZOMBIE,CLASS_NECROMANT,10,10,4,0,0},
  3893.         {RACE_ZOMBIE,CLASS_NECROMANT,11,11,4,0,0},
  3894.         {RACE_ZOMBIE,CLASS_NECROMANT,12,11,4,0,0},
  3895.         {RACE_ZOMBIE,CLASS_NECROMANT,13,11,4,0,0},
  3896.         {RACE_ZOMBIE,CLASS_NECROMANT,14,13,4,0,0},
  3897.         {RACE_ZOMBIE,CLASS_NECROMANT,15,14,5,0,0},
  3898.         {RACE_ZOMBIE,CLASS_NECROMANT,16,15,5,0,0},
  3899.         {RACE_ZOMBIE,CLASS_NECROMANT,17,16,5,0,0},
  3900.         {RACE_ZOMBIE,CLASS_NECROMANT,18,17,5,0,0},
  3901.         {RACE_ZOMBIE,CLASS_NECROMANT,19,18,5,0,0},
  3902.         {RACE_ZOMBIE,CLASS_NECROMANT,20,20,5,0,0},
  3903.         {RACE_ZOMBIE,CLASS_NECROMANT,21,21,5,0,0},
  3904.         {RACE_ZOMBIE,CLASS_NECROMANT,22,22,5,0,0},
  3905.         {RACE_ZOMBIE,CLASS_NECROMANT,23,23,5,0,0},
  3906.         {RACE_ZOMBIE,CLASS_NECROMANT,24,24,5,0,0},
  3907.         {RACE_ZOMBIE,CLASS_NECROMANT,25,25,5,0,0},
  3908.         {RACE_ZOMBIE,CLASS_NECROMANT,26,26,6,0,0},
  3909.         {RACE_ZOMBIE,CLASS_NECROMANT,27,27,7,0,0},
  3910.         {RACE_ZOMBIE,CLASS_NECROMANT,28,27,7,0,0},
  3911.         {RACE_ZOMBIE,CLASS_NECROMANT,29,29,8,0,0},
  3912.         {RACE_ZOMBIE,CLASS_NECROMANT,30,30,8,0,0},
  3913.         {RACE_ZOMBIE,CLASS_NECROMANT,31,32,8,0,0},
  3914.         {RACE_ZOMBIE,CLASS_NECROMANT,32,34,8,0,0},
  3915.         {RACE_ZOMBIE,CLASS_NECROMANT,33,35,8,0,0},
  3916.         {RACE_ZOMBIE,CLASS_NECROMANT,34,37,9,0,0},
  3917.         {RACE_ZOMBIE,CLASS_NECROMANT,35,38,10,0,0},
  3918.         {RACE_ZOMBIE,CLASS_NECROMANT,36,39,10,0,0},
  3919.         {RACE_ZOMBIE,CLASS_NECROMANT,37,41,10,0,0},
  3920.         {RACE_ZOMBIE,CLASS_NECROMANT,38,41,10,0,0},
  3921.         {RACE_ZOMBIE,CLASS_NECROMANT,39,42,10,0,0},
  3922.         {RACE_ZOMBIE,CLASS_NECROMANT,40,43,10,0,0},
  3923.         {RACE_ZOMBIE,CLASS_NECROMANT,41,43,11,0,0},
  3924.         {RACE_ZOMBIE,CLASS_NECROMANT,42,44,12,0,0},
  3925.         {RACE_ZOMBIE,CLASS_NECROMANT,43,44,13,0,0},
  3926.         {RACE_ZOMBIE,CLASS_NECROMANT,44,45,13,0,0},
  3927.         {RACE_ZOMBIE,CLASS_NECROMANT,45,47,13,0,0},
  3928.         {RACE_ZOMBIE,CLASS_NECROMANT,46,48,14,0,0},
  3929.         {RACE_ZOMBIE,CLASS_NECROMANT,47,49,15,0,0},
  3930.         {RACE_ZOMBIE,CLASS_NECROMANT,48,50,16,0,0},
  3931.         {RACE_ZOMBIE,CLASS_NECROMANT,49,51,16,0,0},
  3932.         {RACE_ZOMBIE,CLASS_NECROMANT,50,53,17,0,0},
  3933.         {RACE_ZOMBIE,CLASS_NECROMANT,51,55,17,0,0},
  3934.         {RACE_ZOMBIE,CLASS_CLERIC,0,0,0,0,0},
  3935.         {RACE_ZOMBIE,CLASS_CLERIC,1,1,0,0,1},
  3936.         {RACE_ZOMBIE,CLASS_CLERIC,2,2,0,0,2},
  3937.         {RACE_ZOMBIE,CLASS_CLERIC,3,3,0,0,3},
  3938.         {RACE_ZOMBIE,CLASS_CLERIC,4,4,0,0,4},
  3939.         {RACE_ZOMBIE,CLASS_CLERIC,5,5,0,0,5},
  3940.         {RACE_ZOMBIE,CLASS_CLERIC,6,6,0,0,6},
  3941.         {RACE_ZOMBIE,CLASS_CLERIC,7,7,0,0,7},
  3942.         {RACE_ZOMBIE,CLASS_CLERIC,8,8,0,0,8},
  3943.         {RACE_ZOMBIE,CLASS_CLERIC,9,9,0,0,9},
  3944.         {RACE_ZOMBIE,CLASS_CLERIC,10,10,0,0,10},
  3945.         {RACE_ZOMBIE,CLASS_CLERIC,11,11,0,0,11},
  3946.         {RACE_ZOMBIE,CLASS_CLERIC,12,12,0,0,12},
  3947.         {RACE_ZOMBIE,CLASS_CLERIC,13,13,0,0,13},
  3948.         {RACE_ZOMBIE,CLASS_CLERIC,14,14,0,0,14},
  3949.         {RACE_ZOMBIE,CLASS_CLERIC,15,15,0,0,15},
  3950.         {RACE_ZOMBIE,CLASS_CLERIC,16,16,0,0,16},
  3951.         {RACE_ZOMBIE,CLASS_CLERIC,17,17,0,0,17},
  3952.         {RACE_ZOMBIE,CLASS_CLERIC,18,18,0,0,18},
  3953.         {RACE_ZOMBIE,CLASS_CLERIC,19,19,0,0,19},
  3954.         {RACE_ZOMBIE,CLASS_CLERIC,20,20,0,0,20},
  3955.         {RACE_ZOMBIE,CLASS_CLERIC,21,21,0,0,21},
  3956.         {RACE_ZOMBIE,CLASS_CLERIC,22,22,0,0,22},
  3957.         {RACE_ZOMBIE,CLASS_CLERIC,23,23,0,0,23},
  3958.         {RACE_ZOMBIE,CLASS_CLERIC,24,24,0,0,24},
  3959.         {RACE_ZOMBIE,CLASS_CLERIC,25,25,0,0,25},
  3960.         {RACE_ZOMBIE,CLASS_CLERIC,26,26,0,0,26},
  3961.         {RACE_ZOMBIE,CLASS_CLERIC,27,27,0,0,27},
  3962.         {RACE_ZOMBIE,CLASS_CLERIC,28,28,0,0,28},
  3963.         {RACE_ZOMBIE,CLASS_CLERIC,29,29,0,0,29},
  3964.         {RACE_ZOMBIE,CLASS_CLERIC,30,30,0,0,30},
  3965.         {RACE_ZOMBIE,CLASS_CLERIC,31,31,0,0,31},
  3966.         {RACE_ZOMBIE,CLASS_CLERIC,32,32,0,0,32},
  3967.         {RACE_ZOMBIE,CLASS_CLERIC,33,33,0,0,33},
  3968.         {RACE_ZOMBIE,CLASS_CLERIC,34,34,0,0,34},
  3969.         {RACE_ZOMBIE,CLASS_CLERIC,35,35,0,0,35},
  3970.         {RACE_ZOMBIE,CLASS_CLERIC,36,36,0,0,36},
  3971.         {RACE_ZOMBIE,CLASS_CLERIC,37,37,0,0,37},
  3972.         {RACE_ZOMBIE,CLASS_CLERIC,38,38,0,0,38},
  3973.         {RACE_ZOMBIE,CLASS_CLERIC,39,39,0,0,39},
  3974.         {RACE_ZOMBIE,CLASS_CLERIC,40,40,0,0,40},
  3975.         {RACE_ZOMBIE,CLASS_CLERIC,41,41,0,0,41},
  3976.         {RACE_ZOMBIE,CLASS_CLERIC,42,42,0,0,42},
  3977.         {RACE_ZOMBIE,CLASS_CLERIC,43,43,0,0,43},
  3978.         {RACE_ZOMBIE,CLASS_CLERIC,44,44,0,0,44},
  3979.         {RACE_ZOMBIE,CLASS_CLERIC,45,45,0,0,45},
  3980.         {RACE_ZOMBIE,CLASS_CLERIC,46,46,0,0,46},
  3981.         {RACE_ZOMBIE,CLASS_CLERIC,47,47,0,0,47},
  3982.         {RACE_ZOMBIE,CLASS_CLERIC,48,48,0,0,48},
  3983.         {RACE_ZOMBIE,CLASS_CLERIC,49,49,0,0,49},
  3984.         {RACE_ZOMBIE,CLASS_CLERIC,50,50,0,0,50},
  3985.         {RACE_ZOMBIE,CLASS_CLERIC,51,51,0,0,51},
  3986.         {RACE_ZOMBIE,CLASS_THIEF,0,0,0,0,0},
  3987.         {RACE_ZOMBIE,CLASS_THIEF,1,1,0,0,0},
  3988.         {RACE_ZOMBIE,CLASS_THIEF,2,2,0,0,0},
  3989.         {RACE_ZOMBIE,CLASS_THIEF,3,3,0,0,0},
  3990.         {RACE_ZOMBIE,CLASS_THIEF,4,4,0,0,0},
  3991.         {RACE_ZOMBIE,CLASS_THIEF,5,5,0,0,0},
  3992.         {RACE_ZOMBIE,CLASS_THIEF,6,6,0,0,0},
  3993.         {RACE_ZOMBIE,CLASS_THIEF,7,7,0,0,0},
  3994.         {RACE_ZOMBIE,CLASS_THIEF,8,8,0,0,0},
  3995.         {RACE_ZOMBIE,CLASS_THIEF,9,9,0,0,0},
  3996.         {RACE_ZOMBIE,CLASS_THIEF,10,10,0,0,0},
  3997.         {RACE_ZOMBIE,CLASS_THIEF,11,11,0,0,0},
  3998.         {RACE_ZOMBIE,CLASS_THIEF,12,12,0,0,0},
  3999.         {RACE_ZOMBIE,CLASS_THIEF,13,13,0,0,0},
  4000.         {RACE_ZOMBIE,CLASS_THIEF,14,14,0,0,0},
  4001.         {RACE_ZOMBIE,CLASS_THIEF,15,15,0,0,0},
  4002.         {RACE_ZOMBIE,CLASS_THIEF,16,16,0,0,0},
  4003.         {RACE_ZOMBIE,CLASS_THIEF,17,17,0,0,0},
  4004.         {RACE_ZOMBIE,CLASS_THIEF,18,18,0,0,0},
  4005.         {RACE_ZOMBIE,CLASS_THIEF,19,19,0,0,0},
  4006.         {RACE_ZOMBIE,CLASS_THIEF,20,20,0,0,0},
  4007.         {RACE_ZOMBIE,CLASS_THIEF,21,21,0,0,0},
  4008.         {RACE_ZOMBIE,CLASS_THIEF,22,22,0,0,0},
  4009.         {RACE_ZOMBIE,CLASS_THIEF,23,23,0,0,0},
  4010.         {RACE_ZOMBIE,CLASS_THIEF,24,24,0,0,0},
  4011.         {RACE_ZOMBIE,CLASS_THIEF,25,25,0,0,0},
  4012.         {RACE_ZOMBIE,CLASS_THIEF,26,26,0,0,0},
  4013.         {RACE_ZOMBIE,CLASS_THIEF,27,27,0,0,0},
  4014.         {RACE_ZOMBIE,CLASS_THIEF,28,28,0,0,0},
  4015.         {RACE_ZOMBIE,CLASS_THIEF,29,29,0,0,0},
  4016.         {RACE_ZOMBIE,CLASS_THIEF,30,30,0,0,0},
  4017.         {RACE_ZOMBIE,CLASS_THIEF,31,31,0,0,0},
  4018.         {RACE_ZOMBIE,CLASS_THIEF,32,32,0,0,0},
  4019.         {RACE_ZOMBIE,CLASS_THIEF,33,33,0,0,0},
  4020.         {RACE_ZOMBIE,CLASS_THIEF,34,34,0,0,0},
  4021.         {RACE_ZOMBIE,CLASS_THIEF,35,35,0,0,0},
  4022.         {RACE_ZOMBIE,CLASS_THIEF,36,36,0,0,0},
  4023.         {RACE_ZOMBIE,CLASS_THIEF,37,37,0,0,0},
  4024.         {RACE_ZOMBIE,CLASS_THIEF,38,38,0,0,0},
  4025.         {RACE_ZOMBIE,CLASS_THIEF,39,39,0,0,0},
  4026.         {RACE_ZOMBIE,CLASS_THIEF,40,40,0,0,0},
  4027.         {RACE_ZOMBIE,CLASS_THIEF,41,41,0,0,0},
  4028.         {RACE_ZOMBIE,CLASS_THIEF,42,42,0,0,0},
  4029.         {RACE_ZOMBIE,CLASS_THIEF,43,43,0,0,0},
  4030.         {RACE_ZOMBIE,CLASS_THIEF,44,44,0,0,0},
  4031.         {RACE_ZOMBIE,CLASS_THIEF,45,45,0,0,0},
  4032.         {RACE_ZOMBIE,CLASS_THIEF,46,46,0,0,0},
  4033.         {RACE_ZOMBIE,CLASS_THIEF,47,47,0,0,0},
  4034.         {RACE_ZOMBIE,CLASS_THIEF,48,48,0,0,0},
  4035.         {RACE_ZOMBIE,CLASS_THIEF,49,49,0,0,0},
  4036.         {RACE_ZOMBIE,CLASS_THIEF,50,50,0,0,0},
  4037.         {RACE_ZOMBIE,CLASS_THIEF,51,51,0,0,0},
  4038.         {RACE_ZOMBIE,CLASS_NAZGUL,0,0,0,0,0},
  4039.         {RACE_ZOMBIE,CLASS_NAZGUL,1,1,0,0,0},
  4040.         {RACE_ZOMBIE,CLASS_NAZGUL,2,2,0,0,0},
  4041.         {RACE_ZOMBIE,CLASS_NAZGUL,3,2,0,0,0},
  4042.         {RACE_ZOMBIE,CLASS_NAZGUL,4,3,0,0,0},
  4043.         {RACE_ZOMBIE,CLASS_NAZGUL,5,4,0,0,0},
  4044.         {RACE_ZOMBIE,CLASS_NAZGUL,6,6,0,0,0},
  4045.         {RACE_ZOMBIE,CLASS_NAZGUL,7,6,0,0,0},
  4046.         {RACE_ZOMBIE,CLASS_NAZGUL,8,7,0,0,0},
  4047.         {RACE_ZOMBIE,CLASS_NAZGUL,9,8,0,0,0},
  4048.         {RACE_ZOMBIE,CLASS_NAZGUL,10,9,0,0,0},
  4049.         {RACE_ZOMBIE,CLASS_NAZGUL,11,11,0,0,0},
  4050.         {RACE_ZOMBIE,CLASS_NAZGUL,12,12,0,0,0},
  4051.         {RACE_ZOMBIE,CLASS_NAZGUL,13,13,0,0,0},
  4052.         {RACE_ZOMBIE,CLASS_NAZGUL,14,14,0,0,0},
  4053.         {RACE_ZOMBIE,CLASS_NAZGUL,15,15,0,0,0},
  4054.         {RACE_ZOMBIE,CLASS_NAZGUL,16,17,0,0,0},
  4055.         {RACE_ZOMBIE,CLASS_NAZGUL,17,18,0,0,0},
  4056.         {RACE_ZOMBIE,CLASS_NAZGUL,18,19,0,0,0},
  4057.         {RACE_ZOMBIE,CLASS_NAZGUL,19,20,0,0,0},
  4058.         {RACE_ZOMBIE,CLASS_NAZGUL,20,21,0,0,0},
  4059.         {RACE_ZOMBIE,CLASS_NAZGUL,21,22,0,0,0},
  4060.         {RACE_ZOMBIE,CLASS_NAZGUL,22,24,0,0,0},
  4061.         {RACE_ZOMBIE,CLASS_NAZGUL,23,24,0,0,0},
  4062.         {RACE_ZOMBIE,CLASS_NAZGUL,24,25,0,0,0},
  4063.         {RACE_ZOMBIE,CLASS_NAZGUL,25,26,0,0,0},
  4064.         {RACE_ZOMBIE,CLASS_NAZGUL,26,27,0,0,0},
  4065.         {RACE_ZOMBIE,CLASS_NAZGUL,27,28,0,0,0},
  4066.         {RACE_ZOMBIE,CLASS_NAZGUL,28,29,0,0,0},
  4067.         {RACE_ZOMBIE,CLASS_NAZGUL,29,29,0,0,0},
  4068.         {RACE_ZOMBIE,CLASS_NAZGUL,30,30,0,0,0},
  4069.         {RACE_ZOMBIE,CLASS_NAZGUL,31,30,0,0,0},
  4070.         {RACE_ZOMBIE,CLASS_NAZGUL,32,30,0,0,0},
  4071.         {RACE_ZOMBIE,CLASS_NAZGUL,33,31,0,0,0},
  4072.         {RACE_ZOMBIE,CLASS_NAZGUL,34,31,0,0,0},
  4073.         {RACE_ZOMBIE,CLASS_NAZGUL,35,33,0,0,0},
  4074.         {RACE_ZOMBIE,CLASS_NAZGUL,36,34,0,0,0},
  4075.         {RACE_ZOMBIE,CLASS_NAZGUL,37,35,0,0,0},
  4076.         {RACE_ZOMBIE,CLASS_NAZGUL,38,36,0,0,0},
  4077.         {RACE_ZOMBIE,CLASS_NAZGUL,39,36,0,0,0},
  4078.         {RACE_ZOMBIE,CLASS_NAZGUL,40,37,0,0,0},
  4079.         {RACE_ZOMBIE,CLASS_NAZGUL,41,37,0,0,0},
  4080.         {RACE_ZOMBIE,CLASS_NAZGUL,42,39,0,0,0},
  4081.         {RACE_ZOMBIE,CLASS_NAZGUL,43,40,0,0,0},
  4082.         {RACE_ZOMBIE,CLASS_NAZGUL,44,42,0,0,0},
  4083.         {RACE_ZOMBIE,CLASS_NAZGUL,45,43,0,0,0},
  4084.         {RACE_ZOMBIE,CLASS_NAZGUL,46,44,0,0,0},
  4085.         {RACE_ZOMBIE,CLASS_NAZGUL,47,45,0,0,0},
  4086.         {RACE_ZOMBIE,CLASS_NAZGUL,48,47,0,0,0},
  4087.         {RACE_ZOMBIE,CLASS_NAZGUL,49,49,0,0,0},
  4088.         {RACE_ZOMBIE,CLASS_NAZGUL,50,51,0,0,0},
  4089.         {RACE_ZOMBIE,CLASS_NAZGUL,51,52,0,0,0},
  4090.         {RACE_ZOMBIE,CLASS_MAGE,0,0,0,0,0},
  4091.         {RACE_ZOMBIE,CLASS_MAGE,1,1,1,0,0},
  4092.         {RACE_ZOMBIE,CLASS_MAGE,2,1,2,0,0},
  4093.         {RACE_ZOMBIE,CLASS_MAGE,3,2,3,0,0},
  4094.         {RACE_ZOMBIE,CLASS_MAGE,4,3,4,0,0},
  4095.         {RACE_ZOMBIE,CLASS_MAGE,5,4,4,0,0},
  4096.         {RACE_ZOMBIE,CLASS_MAGE,6,5,5,0,0},
  4097.         {RACE_ZOMBIE,CLASS_MAGE,7,6,5,0,0},
  4098.         {RACE_ZOMBIE,CLASS_MAGE,8,8,5,0,0},
  4099.         {RACE_ZOMBIE,CLASS_MAGE,9,9,5,0,0},
  4100.         {RACE_ZOMBIE,CLASS_MAGE,10,11,6,0,0},
  4101.         {RACE_ZOMBIE,CLASS_MAGE,11,12,7,0,0},
  4102.         {RACE_ZOMBIE,CLASS_MAGE,12,13,8,0,0},
  4103.         {RACE_ZOMBIE,CLASS_MAGE,13,14,9,0,0},
  4104.         {RACE_ZOMBIE,CLASS_MAGE,14,14,10,0,0},
  4105.         {RACE_ZOMBIE,CLASS_MAGE,15,15,11,0,0},
  4106.         {RACE_ZOMBIE,CLASS_MAGE,16,15,12,0,0},
  4107.         {RACE_ZOMBIE,CLASS_MAGE,17,16,12,0,0},
  4108.         {RACE_ZOMBIE,CLASS_MAGE,18,17,12,0,0},
  4109.         {RACE_ZOMBIE,CLASS_MAGE,19,18,13,0,0},
  4110.         {RACE_ZOMBIE,CLASS_MAGE,20,19,14,0,0},
  4111.         {RACE_ZOMBIE,CLASS_MAGE,21,21,15,0,0},
  4112.         {RACE_ZOMBIE,CLASS_MAGE,22,22,16,0,0},
  4113.         {RACE_ZOMBIE,CLASS_MAGE,23,22,16,0,0},
  4114.         {RACE_ZOMBIE,CLASS_MAGE,24,24,16,0,0},
  4115.         {RACE_ZOMBIE,CLASS_MAGE,25,25,16,0,0},
  4116.         {RACE_ZOMBIE,CLASS_MAGE,26,26,16,0,0},
  4117.         {RACE_ZOMBIE,CLASS_MAGE,27,27,16,0,0},
  4118.         {RACE_ZOMBIE,CLASS_MAGE,28,28,16,0,0},
  4119.         {RACE_ZOMBIE,CLASS_MAGE,29,29,17,0,0},
  4120.         {RACE_ZOMBIE,CLASS_MAGE,30,31,17,0,0},
  4121.         {RACE_ZOMBIE,CLASS_MAGE,31,33,17,0,0},
  4122.         {RACE_ZOMBIE,CLASS_MAGE,32,34,17,0,0},
  4123.         {RACE_ZOMBIE,CLASS_MAGE,33,36,18,0,0},
  4124.         {RACE_ZOMBIE,CLASS_MAGE,34,37,18,0,0},
  4125.         {RACE_ZOMBIE,CLASS_MAGE,35,39,19,0,0},
  4126.         {RACE_ZOMBIE,CLASS_MAGE,36,40,20,0,0},
  4127.         {RACE_ZOMBIE,CLASS_MAGE,37,42,21,0,0},
  4128.         {RACE_ZOMBIE,CLASS_MAGE,38,44,21,0,0},
  4129.         {RACE_ZOMBIE,CLASS_MAGE,39,45,22,0,0},
  4130.         {RACE_ZOMBIE,CLASS_MAGE,40,46,23,0,0},
  4131.         {RACE_ZOMBIE,CLASS_MAGE,41,46,23,0,0},
  4132.         {RACE_ZOMBIE,CLASS_MAGE,42,47,23,0,0},
  4133.         {RACE_ZOMBIE,CLASS_MAGE,43,48,23,0,0},
  4134.         {RACE_ZOMBIE,CLASS_MAGE,44,48,24,0,0},
  4135.         {RACE_ZOMBIE,CLASS_MAGE,45,49,24,0,0},
  4136.         {RACE_ZOMBIE,CLASS_MAGE,46,50,24,0,0},
  4137.         {RACE_ZOMBIE,CLASS_MAGE,47,51,25,0,0},
  4138.         {RACE_ZOMBIE,CLASS_MAGE,48,52,25,0,0},
  4139.         {RACE_ZOMBIE,CLASS_MAGE,49,53,25,0,0},
  4140.         {RACE_ZOMBIE,CLASS_MAGE,50,54,25,0,0},
  4141.         {RACE_ZOMBIE,CLASS_MAGE,51,55,26,0,0},
  4142.         {RACE_TIGGUAN,CLASS_WARRIOR,0,0,0,0,0},
  4143.         {RACE_TIGGUAN,CLASS_WARRIOR,1,1,1,0,0},
  4144.         {RACE_TIGGUAN,CLASS_WARRIOR,2,2,0,0,0},
  4145.         {RACE_TIGGUAN,CLASS_WARRIOR,3,3,0,0,0},
  4146.         {RACE_TIGGUAN,CLASS_WARRIOR,4,4,1,0,0},
  4147.         {RACE_TIGGUAN,CLASS_WARRIOR,5,5,1,0,0},
  4148.         {RACE_TIGGUAN,CLASS_WARRIOR,6,6,1,0,0},
  4149.         {RACE_TIGGUAN,CLASS_WARRIOR,7,6,2,0,0},
  4150.         {RACE_TIGGUAN,CLASS_WARRIOR,8,7,2,0,0},
  4151.         {RACE_TIGGUAN,CLASS_WARRIOR,9,7,2,0,0},
  4152.         {RACE_TIGGUAN,CLASS_WARRIOR,10,7,3,0,0},
  4153.         {RACE_TIGGUAN,CLASS_WARRIOR,11,7,2,0,0},
  4154.         {RACE_TIGGUAN,CLASS_WARRIOR,12,8,2,0,0},
  4155.         {RACE_TIGGUAN,CLASS_WARRIOR,13,9,2,0,0},
  4156.         {RACE_TIGGUAN,CLASS_WARRIOR,14,10,2,0,0},
  4157.         {RACE_TIGGUAN,CLASS_WARRIOR,15,11,3,0,0},
  4158.         {RACE_TIGGUAN,CLASS_WARRIOR,16,11,3,0,0},
  4159.         {RACE_TIGGUAN,CLASS_WARRIOR,17,13,3,0,0},
  4160.         {RACE_TIGGUAN,CLASS_WARRIOR,18,14,3,0,0},
  4161.         {RACE_TIGGUAN,CLASS_WARRIOR,19,15,3,0,0},
  4162.         {RACE_TIGGUAN,CLASS_WARRIOR,20,16,3,0,0},
  4163.         {RACE_TIGGUAN,CLASS_WARRIOR,21,17,4,0,0},
  4164.         {RACE_TIGGUAN,CLASS_WARRIOR,22,18,5,0,0},
  4165.         {RACE_TIGGUAN,CLASS_WARRIOR,23,19,5,0,0},
  4166.         {RACE_TIGGUAN,CLASS_WARRIOR,24,20,6,0,0},
  4167.         {RACE_TIGGUAN,CLASS_WARRIOR,25,22,6,0,0},
  4168.         {RACE_TIGGUAN,CLASS_WARRIOR,26,22,5,0,0},
  4169.         {RACE_TIGGUAN,CLASS_WARRIOR,27,23,4,0,0},
  4170.         {RACE_TIGGUAN,CLASS_WARRIOR,28,24,3,0,0},
  4171.         {RACE_TIGGUAN,CLASS_WARRIOR,29,25,3,0,0},
  4172.         {RACE_TIGGUAN,CLASS_WARRIOR,30,26,4,0,0},
  4173.         {RACE_TIGGUAN,CLASS_WARRIOR,31,26,4,0,0},
  4174.         {RACE_TIGGUAN,CLASS_WARRIOR,32,27,4,0,0},
  4175.         {RACE_TIGGUAN,CLASS_WARRIOR,33,29,4,0,0},
  4176.         {RACE_TIGGUAN,CLASS_WARRIOR,34,30,4,0,0},
  4177.         {RACE_TIGGUAN,CLASS_WARRIOR,35,32,3,0,0},
  4178.         {RACE_TIGGUAN,CLASS_WARRIOR,36,34,2,0,0},
  4179.         {RACE_TIGGUAN,CLASS_WARRIOR,37,34,1,0,0},