Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 25.33 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <sys/stat.h>
  4. #include <ctype.h>
  5. #include <SDL_keysym.h>
  6. #include "errors.h"
  7. #include "keys.h"
  8. #include "asc.h"
  9. #include "init.h"
  10. #include "misc.h"
  11. #ifdef FASTER_MAP_LOAD
  12. #include "io/elfilewrapper.h"
  13. #endif
  14.  
  15. // default definitions for keys
  16. Uint32 K_QUIT=ALT|'x';
  17. #ifdef WINDOWS
  18. // Windows SDL reports [Alt Gr] as [Ctrl], which hinders German users typing '@',
  19. // so don't use Ctrl-q as a symbol to exit
  20. Uint32 K_QUIT_ALT=ALT|'x';
  21. #elif OSX
  22. Uint32 K_QUIT_ALT=KMOD_LMETA|'q';
  23. #else
  24. Uint32 K_QUIT_ALT=CTRL|'q';
  25. #endif
  26. Uint32 K_CAMERAUP=SDLK_UP;
  27. Uint32 K_CAMERADOWN=SDLK_DOWN;
  28. Uint32 K_ZOOMOUT=SDLK_PAGEDOWN;
  29. Uint32 K_ZOOMIN=SDLK_PAGEUP;
  30. Uint32 K_TURNLEFT=SDLK_INSERT;
  31. Uint32 K_TURNRIGHT=SDLK_DELETE;
  32. Uint32 K_ADVANCE=SDLK_HOME;
  33. Uint32 K_HEALTHBAR=ALT|'h';
  34. Uint32 K_VIEWNAMES=ALT|'n';
  35. Uint32 K_VIEWHP=ALT|'b';
  36. Uint32 K_STATS=CTRL|'a';
  37. Uint32 K_QUESTLOG=CTRL|'g';
  38. Uint32 K_SESSION=CTRL|'z';
  39. Uint32 K_WALK=CTRL|'w';
  40. Uint32 K_LOOK=CTRL|'l';
  41. Uint32 K_USE=CTRL|'u';
  42. Uint32 K_OPTIONS=CTRL|'o';
  43. Uint32 K_REPEATSPELL=CTRL|'r';
  44. Uint32 K_SIGILS=CTRL|'s';
  45. Uint32 K_MANUFACTURE=CTRL|'m';
  46. Uint32 K_ITEMS=CTRL|'i';
  47. Uint32 K_MAP=SDLK_TAB;
  48. Uint32 K_MINIMAP=ALT|'m';
  49. Uint32 K_ROTATELEFT=SDLK_LEFT;
  50. Uint32 K_ROTATERIGHT=SDLK_RIGHT;
  51. Uint32 K_FROTATELEFT=SHIFT|SDLK_LEFT;
  52. Uint32 K_FROTATERIGHT=SHIFT|SDLK_RIGHT;
  53. Uint32 K_BROWSER=SDLK_F2;
  54. Uint32 K_BROWSERWIN=CTRL|SDLK_F2;
  55. Uint32 K_ESCAPE=SDLK_ESCAPE;
  56. Uint32 K_CONSOLE=SDLK_F1;
  57. Uint32 K_SHADOWS=SDLK_F3;
  58. Uint32 K_KNOWLEDGE=CTRL|'k';
  59. Uint32 K_ENCYCLOPEDIA=CTRL|'e';
  60. Uint32 K_HELP=CTRL|'h';
  61. Uint32 K_NOTEPAD=CTRL|'n';
  62. Uint32 K_HIDEWINS=ALT|'d';
  63. Uint32 K_ITEM1=CTRL|'1';
  64. Uint32 K_ITEM2=CTRL|'2';
  65. Uint32 K_ITEM3=CTRL|'3';
  66. Uint32 K_ITEM4=CTRL|'4';
  67. Uint32 K_ITEM5=CTRL|'5';
  68. Uint32 K_ITEM6=CTRL|'6';
  69. Uint32 K_ITEM7=CTRL|'7';
  70. Uint32 K_ITEM8=CTRL|'8';
  71. Uint32 K_ITEM9=CTRL|'9';
  72. Uint32 K_ITEM10=CTRL|'0';
  73. Uint32 K_ITEM11=CTRL|'-';
  74. Uint32 K_ITEM12=CTRL|'=';
  75. Uint32 K_SCREENSHOT=CTRL|'p';
  76. Uint32 K_VIEWTEXTASOVERTEXT=ALT|'o';
  77. Uint32 K_AFK=CTRL|ALT|'a';
  78. Uint32 K_SIT=ALT|'s';
  79. Uint32 K_RANGINGLOCK=ALT|'r';
  80. Uint32 K_BUDDY=CTRL|'b';
  81. Uint32 K_NEXT_CHAT_TAB=CTRL|SDLK_PAGEDOWN;
  82. Uint32 K_PREV_CHAT_TAB=CTRL|SDLK_PAGEUP;
  83. Uint32 K_RULES=SDLK_F5;
  84. Uint32 K_SPELL1=ALT|'1';
  85. Uint32 K_SPELL2=ALT|'2';
  86. Uint32 K_SPELL3=ALT|'3';
  87. Uint32 K_SPELL4=ALT|'4';
  88. Uint32 K_SPELL5=ALT|'5';
  89. Uint32 K_SPELL6=ALT|'6';
  90. Uint32 K_SPELL7=ALT|'7';
  91. Uint32 K_SPELL8=ALT|'8';
  92. Uint32 K_SPELL9=ALT|'9';
  93. Uint32 K_SPELL10=ALT|'0';
  94. Uint32 K_SPELL11=ALT|'-';
  95. Uint32 K_SPELL12=ALT|'=';
  96. Uint32 K_TABCOMPLETE=CTRL|' ';
  97. Uint32 K_WINDOWS_ON_TOP=ALT|'w';
  98. Uint32 K_MARKFILTER=CTRL|'f';
  99. Uint32 K_OPAQUEWIN=CTRL|'d';
  100. Uint32 K_GRAB_MOUSE=ALT|'g';
  101. Uint32 K_FIRST_PERSON=ALT|'f';
  102. Uint32 K_EXTEND_CAM=ALT|'e';
  103. #ifndef OSX
  104. Uint32 K_CUT=CTRL|'x';
  105. Uint32 K_COPY=CTRL|'c';
  106. Uint32 K_PASTE=CTRL|'v';
  107. #else
  108. Uint32 K_CUT=KMOD_LMETA|'x';
  109. Uint32 K_COPY=KMOD_LMETA|'c';
  110. Uint32 K_PASTE=KMOD_LMETA|'v';
  111. #endif
  112. Uint32 K_COPY_ALT=CTRL|SDLK_INSERT;
  113. Uint32 K_PASTE_ALT=SHIFT|SDLK_INSERT;
  114. #ifdef ECDEBUGWIN
  115. Uint32 K_ECDEBUGWIN=ALT|CTRL|'c';
  116. #endif
  117. Uint32 K_EMOTES=CTRL|'j';
  118. Uint32 K_RANGINGWIN=CTRL|'t';
  119.  
  120. static void add_key(Uint32 *key, Uint32 n)
  121. {
  122.     switch (n)
  123.     {
  124.         case 303:
  125.         case 304:
  126.             *key |= SHIFT;
  127.             break;
  128.         case 305:
  129.         case 306:
  130.             *key |= CTRL;
  131.             break;
  132.         case 307:
  133.         case 308:
  134.             *key |= ALT;
  135.             break;
  136.         default:
  137.             *key = (n & 0xFFFF) | (*key &0xFFFF0000);
  138.         }
  139. }
  140.  
  141. static Uint32 CRC32(const char *data, int len)
  142. {
  143.     unsigned int result = 0;
  144.     int i, j;
  145.     unsigned char octet;
  146.  
  147.     for (i = 0; i < len; i++)
  148.     {
  149.         octet = *(data++);
  150.         for (j = 0; j < 8; j++)
  151.         {
  152.             if ((octet >> 7) ^ (result >> 31))
  153.                 result = (result << 1) ^ 0x04c11db7;
  154.             else
  155.                 result = (result << 1);
  156.             octet <<= 1;
  157.         }
  158.     }
  159.  
  160.     return ~result;
  161. }
  162.  
  163. static Uint16 get_key_code(const char *key)
  164. {
  165.     int len = strlen(key);
  166.  
  167.     if (len==1)
  168.     {
  169.         return tolower(key[0]);
  170.     }
  171.     else
  172.     {
  173.         Uint32 crc = CRC32(key,len);
  174.         switch(crc){
  175.             case 0x414243d2: //UP
  176.                 return 273;
  177.             case 0x8b9c5c32: //F1
  178.                 return 282;
  179.             case 0x86df7aeb: //F2
  180.                 return 283;
  181.             case 0x821e675c: //F3
  182.                 return 284;
  183.             case 0x9c593759: //F4
  184.                 return 285;
  185.             case 0x98982aee: //F5
  186.                 return 286;
  187.             case 0x95db0c37: //F6
  188.                 return 287;
  189.             case 0x911a1180: //F7
  190.                 return 288;
  191.             case 0xa955ac3d: //F8
  192.                 return 289;
  193.             case 0xad94b18a: //F9
  194.                 return 290;
  195.             case 0xbbde3454: //F10
  196.                 return 291;
  197.             case 0xbf1f29e3: //F11
  198.                 return 292;
  199.             case 0xb25c0f3a: //F12
  200.                 return 293;
  201.             case 0xb69d128d: //F13
  202.                 return 294;
  203.             case 0xa8da4288: //F14
  204.                 return 295;
  205.             case 0xac1b5f3f: //F15
  206.                 return 296;
  207.             case 0xe5b332af: //BACKSPACE
  208.                 return 8;
  209.             case 0x3d6742da: //TAB
  210.                 return 9;
  211.             case 0xe4f512ce: //CLEAR
  212.                 return 12;
  213.             case 0xe5c642f: //RETURN
  214.                 return 13;
  215.             case 0x1a3dbcf4: //PAUSE
  216.                 return 19;
  217.             case 0xb23e322f: //ESCAPE
  218.                 return 27;
  219.             case 0xe0ea4208: //SPACE
  220.                 return 32;
  221.             case 0x3f048816: //DELETE
  222.                 return 127;
  223.             case 0x5dd541: //KP0
  224.                 return 256;
  225.             case 0x49cc8f6: //KP1
  226.                 return 257;
  227.             case 0x9dfee2f: //KP2
  228.                 return 258;
  229.             case 0xd1ef398: //KP3
  230.                 return 259;
  231.             case 0x1359a39d: //KP4
  232.                 return 260;
  233.             case 0x1798be2a: //KP5
  234.                 return 261;
  235.             case 0x1adb98f3: //KP6
  236.                 return 262;
  237.             case 0x1e1a8544: //KP7
  238.                 return 263;
  239.             case 0x265538f9: //KP8
  240.                 return 264;
  241.             case 0x2294254e: //KP9
  242.                 return 265;
  243.             case 0xc9681663: //KP_PERIOD
  244.                 return 266;
  245.             case 0xf2032002: //KP_DIVIDE
  246.                 return 267;
  247.             case 0xc69c9177: //KP_MULTIPLY
  248.                 return 268;
  249.             case 0xe05a3b75: //KP_MINUS
  250.                 return 269;
  251.             case 0x7a14ede0: //KP_PLUS
  252.                 return 270;
  253.             case 0xb95fb1fa: //KP_ENTER
  254.                 return 271;
  255.             case 0x997d27b6: //KP_EQUALS
  256.                 return 272;
  257.             case 0x412c789a: //DOWN
  258.                 return 274;
  259.             case 0xcfd43bcf: //RIGHT
  260.                 return 275;
  261.             case 0x14618acf: //LEFT
  262.                 return 276;
  263.             case 0xb448467c: //INSERT
  264.                 return 277;
  265.             case 0xd59321ba: //HOME
  266.                 return 278;
  267.             case 0x863456b7: //END
  268.                 return 279;
  269.             case 0xd541afe1: //PAGEUP
  270.                 return 280;
  271.             case 0x77a53c61: //PAGEDOWN
  272.                 return 281;
  273.             case 0x8563dfd4: //NUMLOCK
  274.                 return 300;
  275.             case 0x4b601de5: //CAPSLOCK
  276.                 return 301;
  277.             case 0x7b642f: //SCROLLOCK
  278.                 return 302;
  279.             case 0x6fa8765e: //RSHIFT
  280.                 return 303;
  281.             case 0x5a59f8b9: //LSHIFT
  282.                 return 304;
  283.             case 0xc535c663: //RCTRL
  284.                 return 305;
  285.             case 0xb5e083f0: //LCTRL
  286.                 return 306;
  287.             case 0xf7a834fb: //RALT
  288.                 return 307;
  289.             case 0x39b9e58e: //LALT
  290.                 return 308;
  291.             case 0x34796737: //RMETA
  292.                 return 309;
  293.             case 0x44ac22a4: //LMETA
  294.                 return 310;
  295.             case 0x8ec5890c: //LSUPER
  296.                 return 311;
  297.             case 0xbb3407eb: //RSUPER
  298.                 return 312;
  299.             case 0x2d5a7586: //MODE
  300.                 return 313;
  301.             case 0x87140862: //COMPOSE
  302.                 return 314;
  303.             case 0x512a6d4b: //HELP
  304.                 return 315;
  305.             case 0xdc87c39e: //PRINT
  306.                 return 316;
  307.             case 0xbdf2d984: //SYSREQ
  308.                 return 317;
  309.             case 0xd318f49: //BREAK
  310.                 return 318;
  311.             case 0x46854e9d: //MENU
  312.                 return 319;
  313.             case 0x8758b6ec: //POWER
  314.                 return 320;
  315.             case 0x1e43eaa9: //EURO
  316.                 return 321;
  317.             case 0xdf6ba7e: //UNDO
  318.                 return 322;
  319.             default:
  320.                 return 0;
  321.         }
  322.     }
  323. }
  324.  
  325. #ifdef FASTER_STARTUP
  326. static const char* escape(const char* line)
  327. {
  328.     static char buf[1024];
  329.     char *buf_end = buf + (sizeof(buf)-1);
  330.     const char *src;
  331.     char *dest;
  332.     int i, j;
  333.  
  334.     src = line;
  335.     dest = buf;
  336.     while (*src && dest < buf_end)
  337.     {
  338.         if (isgraph(*src))
  339.             *dest++ = *src++;
  340.         else
  341.             dest += snprintf(dest, buf_end-dest, "\\x%02x", *src++);
  342.     }
  343.     if (dest >= buf_end)
  344.         *buf_end = '\0';
  345.     else
  346.         *dest = '\0';
  347.  
  348.     return buf;
  349. }
  350.  
  351. static void parse_key_line(const char *line)
  352. {
  353.     char kstr[100], t1[100], t2[100], t3[100], t4[100];
  354.     Uint32 key = 0;
  355.     int nkey = sscanf(line, " #K_%99s = %99s %99s %99s %99s", kstr,
  356.         t1, t2, t3, t4);
  357.  
  358.     printf("nkey = %d, line = \"%s\"\n", nkey, escape(line));
  359.     if (nkey <= 1)
  360.         return;
  361.  
  362.     add_key(&key, get_key_code(t1));
  363.     if (nkey > 2 && t2[0] != '#')
  364.     {
  365.         add_key(&key, get_key_code(t2));
  366.         if (nkey > 3 && t3[0] != '#')
  367.         {
  368.             add_key(&key, get_key_code(t3));
  369.             if (nkey > 4 && t4[0] != '#')
  370.             {
  371.                 add_key(&key, get_key_code(t4));
  372.             }
  373.         }
  374.     }
  375.  
  376.     if (strcasecmp(kstr, "QUIT") == 0)
  377.         K_QUIT = key;
  378.     else if (strcasecmp(kstr, "QUIT_ALT") == 0)
  379.         K_QUIT_ALT = key;
  380.     else if (strcasecmp(kstr, "CAMERAUP") == 0)
  381.         K_CAMERAUP = key;
  382.     else if (strcasecmp(kstr, "CAMERADOWN") == 0)
  383.         K_CAMERADOWN = key;
  384.     else if (strcasecmp(kstr, "ZOOMOUT") == 0)
  385.         K_ZOOMOUT = key;
  386.     else if (strcasecmp(kstr, "ZOOMIN") == 0)
  387.         K_ZOOMIN = key;
  388.     else if (strcasecmp(kstr, "TURNLEFT") == 0)
  389.         K_TURNLEFT = key;
  390.     else if (strcasecmp(kstr, "TURNRIGHT") == 0)
  391.         K_TURNRIGHT = key;
  392.     else if (strcasecmp(kstr, "ADVANCE") == 0)
  393.         K_ADVANCE = key;
  394.     else if (strcasecmp(kstr, "HEALTHBAR") == 0)
  395.         K_HEALTHBAR = key;
  396.     else if (strcasecmp(kstr, "VIEWNAMES") == 0)
  397.         K_VIEWNAMES = key;
  398.     else if (strcasecmp(kstr, "VIEWHP") == 0)
  399.         K_VIEWHP = key;
  400.     else if (strcasecmp(kstr, "STATS") == 0)
  401.         K_STATS = key;
  402.     else if (strcasecmp(kstr, "QUESTLOG") == 0)
  403.         K_QUESTLOG = key;
  404.     else if (strcasecmp(kstr, "SESSION") == 0)
  405.         K_SESSION = key;
  406.     else if (strcasecmp(kstr, "WALK") == 0)
  407.         K_WALK = key;
  408.     else if (strcasecmp(kstr, "LOOK") == 0)
  409.         K_LOOK = key;
  410.     else if (strcasecmp(kstr, "USE") == 0)
  411.         K_USE = key;
  412.     else if (strcasecmp(kstr, "OPTIONS") == 0)
  413.         K_OPTIONS = key;
  414.     else if (strcasecmp(kstr, "REPEATSPELL") == 0)
  415.         K_REPEATSPELL = key;
  416.     else if (strcasecmp(kstr, "SIGILS") == 0)
  417.         K_SIGILS = key;
  418.     else if (strcasecmp(kstr, "MANUFACTURE") == 0)
  419.         K_MANUFACTURE = key;
  420.     else if (strcasecmp(kstr, "ITEMS") == 0)
  421.         K_ITEMS = key;
  422.     else if (strcasecmp(kstr, "MAP") == 0)
  423.         K_MAP = key;
  424.     else if (strcasecmp(kstr, "MINIMAP") == 0)
  425.         K_MINIMAP = key;
  426.     else if (strcasecmp(kstr, "ROTATELEFT") == 0)
  427.         K_ROTATELEFT = key;
  428.     else if (strcasecmp(kstr, "ROTATERIGHT") == 0)
  429.         K_ROTATERIGHT = key;
  430.     else if (strcasecmp(kstr, "FROTATELEFT") == 0)
  431.         K_FROTATELEFT = key;
  432.     else if (strcasecmp(kstr, "FROTATERIGHT") == 0)
  433.         K_FROTATERIGHT = key;
  434.     else if (strcasecmp(kstr, "BROWSER") == 0)
  435.         K_BROWSER = key;
  436.     else if (strcasecmp(kstr, "BROWSERWIN") == 0)
  437.         K_BROWSERWIN = key;
  438.     else if (strcasecmp(kstr, "ESCAPE") == 0)
  439.         K_ESCAPE = key;
  440.     else if (strcasecmp(kstr, "CONSOLE") == 0)
  441.         K_CONSOLE = key;
  442.     else if (strcasecmp(kstr, "SHADOWS") == 0)
  443.         K_SHADOWS = key;
  444.     else if (strcasecmp(kstr, "KNOWLEDGE") == 0)
  445.         K_KNOWLEDGE = key;
  446.     else if (strcasecmp(kstr, "ENCYCLOPEDIA") == 0)
  447.         K_ENCYCLOPEDIA = key;
  448.     else if (strcasecmp(kstr, "HELP") == 0)
  449.         K_HELP = key;
  450.     else if (strcasecmp(kstr, "NOTEPAD") == 0)
  451.         K_NOTEPAD = key;
  452.     else if (strcasecmp(kstr, "HIDEWINS") == 0)
  453.         K_HIDEWINS = key;
  454.     else if (strcasecmp(kstr, "ITEM1") == 0)
  455.         K_ITEM1 = key;
  456.     else if (strcasecmp(kstr, "ITEM2") == 0)
  457.         K_ITEM2 = key;
  458.     else if (strcasecmp(kstr, "ITEM3") == 0)
  459.         K_ITEM3 = key;
  460.     else if (strcasecmp(kstr, "ITEM4") == 0)
  461.         K_ITEM4 = key;
  462.     else if (strcasecmp(kstr, "ITEM5") == 0)
  463.         K_ITEM5 = key;
  464.     else if (strcasecmp(kstr, "ITEM6") == 0)
  465.         K_ITEM6 = key;
  466.     else if (strcasecmp(kstr, "ITEM7") == 0)
  467.         K_ITEM7 = key;
  468.     else if (strcasecmp(kstr, "ITEM8") == 0)
  469.         K_ITEM8 = key;
  470.     else if (strcasecmp(kstr, "ITEM9") == 0)
  471.         K_ITEM9 = key;
  472.     else if (strcasecmp(kstr, "ITEM10") == 0)
  473.         K_ITEM10 = key;
  474.     else if (strcasecmp(kstr, "ITEM11") == 0)
  475.         K_ITEM11 = key;
  476.     else if (strcasecmp(kstr, "ITEM12") == 0)
  477.         K_ITEM12 = key;
  478.     else if (strcasecmp(kstr, "SCREENSHOT") == 0)
  479.         K_SCREENSHOT = key;
  480.     else if (strcasecmp(kstr, "VIEWTEXTASOVERTEXT") == 0)
  481.         K_VIEWTEXTASOVERTEXT = key;
  482.     else if (strcasecmp(kstr, "AFK") == 0)
  483.         K_AFK = key;
  484.     else if (strcasecmp(kstr, "SIT") == 0)
  485.         K_SIT = key;
  486.     else if (strcasecmp(kstr, "RANGINGLOCK") == 0)
  487.         K_RANGINGLOCK = key;
  488.     else if (strcasecmp(kstr, "BUDDY") == 0)
  489.         K_BUDDY = key;
  490.     else if (strcasecmp(kstr, "NEXT_CHAT_TAB") == 0)
  491.         K_NEXT_CHAT_TAB = key;
  492.     else if (strcasecmp(kstr, "PREV_CHAT_TAB") == 0)
  493.         K_PREV_CHAT_TAB = key;
  494.     else if (strcasecmp(kstr, "RULES") == 0)
  495.         K_RULES = key;
  496.     else if (strcasecmp(kstr, "SPELL1") == 0)
  497.         K_SPELL1 = key;
  498.     else if (strcasecmp(kstr, "SPELL2") == 0)
  499.         K_SPELL2 = key;
  500.     else if (strcasecmp(kstr, "SPELL3") == 0)
  501.         K_SPELL3 = key;
  502.     else if (strcasecmp(kstr, "SPELL4") == 0)
  503.         K_SPELL4 = key;
  504.     else if (strcasecmp(kstr, "SPELL5") == 0)
  505.         K_SPELL5 = key;
  506.     else if (strcasecmp(kstr, "SPELL6") == 0)
  507.         K_SPELL6 = key;
  508.     else if (strcasecmp(kstr, "SPELL7") == 0)
  509.         K_SPELL7 = key;
  510.     else if (strcasecmp(kstr, "SPELL8") == 0)
  511.         K_SPELL8 = key;
  512.     else if (strcasecmp(kstr, "SPELL9") == 0)
  513.         K_SPELL9 = key;
  514.     else if (strcasecmp(kstr, "SPELL10") == 0)
  515.         K_SPELL10 = key;
  516.     else if (strcasecmp(kstr, "SPELL11") == 0)
  517.         K_SPELL11 = key;
  518.     else if (strcasecmp(kstr, "SPELL12") == 0)
  519.         K_SPELL12 = key;
  520.     else if (strcasecmp(kstr, "TABCOMPLETE") == 0)
  521.         K_TABCOMPLETE = key;
  522.     else if (strcasecmp(kstr, "WINDOWS_ON_TOP") == 0)
  523.         K_WINDOWS_ON_TOP = key;
  524.     else if (strcasecmp(kstr, "MARKFILTER") == 0)
  525.         K_MARKFILTER = key;
  526.     else if (strcasecmp(kstr, "OPAQUEWIN") == 0)
  527.         K_OPAQUEWIN = key;
  528.     else if (strcasecmp(kstr, "GRAB_MOUSE") == 0)
  529.         K_GRAB_MOUSE = key;
  530.     else if (strcasecmp(kstr, "FIRST_PERSON") == 0)
  531.         K_FIRST_PERSON = key;
  532.     else if (strcasecmp(kstr, "EXTEND_CAM") == 0)
  533.         K_EXTEND_CAM = key;
  534.     else if (strcasecmp(kstr, "EMOTES") == 0)
  535.         K_EMOTES = key;
  536. }
  537.  
  538. // load the dynamic definitions for keys
  539. void read_key_config()
  540. {
  541.     char line[512];
  542.     el_file_ptr f;
  543.  
  544.     f = el_open_custom("key.ini");
  545.     if (!f)
  546.         return; //take the defaults
  547.  
  548.     while (el_fgets(line, sizeof(line), f))
  549.         parse_key_line(line);
  550.  
  551.     el_close(f);
  552. }
  553.  
  554. #else  // FASTER_STARTUP
  555.  
  556. Uint32 parse_key_string (const char *s)
  557. {
  558.     char t1[100],t2[100],t3[100],t4[100];
  559.     Uint32 key=0;
  560.     int nkey = sscanf (s, "%99s %99s %99s %99s", t1, t2, t3, t4);
  561.  
  562.     if (nkey > 0)
  563.     {
  564.         add_key (&key, get_key_code (t1));
  565.         if (nkey > 1 && t2[0] != '#')
  566.         {
  567.             add_key (&key, get_key_code (t2));
  568.             if (nkey > 2 && t3[0] != '#')
  569.             {
  570.                 add_key (&key, get_key_code (t3));
  571.                 if (nkey > 3 && t4[0] != '#')
  572.                 {
  573.                     add_key (&key, get_key_code (t4));
  574.                 }
  575.             }
  576.         }
  577.     }
  578.  
  579.     return key;
  580. }
  581.  
  582. // load the dynamic definitions for keys
  583. void read_key_config()
  584. {
  585.     FILE *f = NULL;
  586.     char * file_mem;
  587.     struct stat key_file;
  588.     int key_file_size,t;
  589.     size_t ret;
  590.  
  591. #ifndef WINDOWS
  592.     char key_ini[256];
  593.     safe_snprintf (key_ini, sizeof (key_ini), "%s/key.ini", configdir);
  594.     // don't use my_fopen, not everyone keeps local settings
  595.     f=fopen(key_ini,"rb"); //try to load local settings
  596.     if(!f) //use global settings
  597.         {
  598.             safe_snprintf (key_ini, sizeof (key_ini), "%s/key.ini", datadir);
  599.             f=my_fopen(key_ini,"rb");
  600.         }
  601.  
  602.     if (f)
  603.         {
  604.             fstat (fileno (f), &key_file);
  605.         }
  606.  
  607. #else
  608.     f=my_fopen("key.ini","rb");
  609.     if (f)
  610.         fstat (fileno (f), &key_file);
  611. #endif
  612.  
  613.     if(!f)
  614.     {
  615.         return; //take the defaults
  616.     }
  617.  
  618.     key_file_size = key_file.st_size;
  619.     if (key_file_size <= 0)
  620.     {
  621.         fclose(f);
  622.         return;
  623.     }
  624.  
  625.     file_mem = (char *) calloc(key_file_size+2, sizeof(Uint8));
  626.     ret = fread (file_mem, 1, key_file_size+1, f);
  627.     fclose(f);
  628.     if (ret != key_file_size)
  629.     {
  630.         LOG_ERROR("%s() read failed %zu %d\n", __FUNCTION__, ret ,key_file_size+1);
  631.         free(file_mem);
  632.         return;
  633.     }
  634.  
  635.     if ( (t = get_string_occurance ("#K_QUIT", file_mem, key_file_size, 0)) != -1)
  636.         K_QUIT = parse_key_string (&file_mem[t]);
  637.     if ( (t = get_string_occurance ("#K_QUIT_ALT", file_mem, key_file_size, 0)) != -1)
  638.         K_QUIT_ALT = parse_key_string (&file_mem[t]);
  639.     if((t=get_string_occurance("#K_CAMERAUP",file_mem,key_file_size,0))!=-1)
  640.         K_CAMERAUP = parse_key_string(&file_mem[t]);
  641.     if((t=get_string_occurance("#K_CAMERADOWN",file_mem,key_file_size,0))!=-1)
  642.         K_CAMERADOWN = parse_key_string(&file_mem[t]);
  643.     if((t=get_string_occurance("#K_ZOOMOUT",file_mem,key_file_size,0))!=-1)
  644.         K_ZOOMOUT = parse_key_string(&file_mem[t]);
  645.     if((t=get_string_occurance("#K_ZOOMIN",file_mem,key_file_size,0))!=-1)
  646.         K_ZOOMIN = parse_key_string(&file_mem[t]);
  647.     if((t=get_string_occurance("#K_TURNLEFT",file_mem,key_file_size,0))!=-1)
  648.         K_TURNLEFT = parse_key_string(&file_mem[t]);
  649.     if((t=get_string_occurance("#K_TURNRIGHT",file_mem,key_file_size,0))!=-1)
  650.         K_TURNRIGHT = parse_key_string(&file_mem[t]);
  651.     if((t=get_string_occurance("#K_ADVANCE",file_mem,key_file_size,0))!=-1)
  652.         K_ADVANCE = parse_key_string(&file_mem[t]);
  653.     if((t=get_string_occurance("#K_HEALTHBAR",file_mem,key_file_size,0))!=-1)
  654.         K_HEALTHBAR = parse_key_string(&file_mem[t]);
  655.     if((t=get_string_occurance("#K_VIEWNAMES",file_mem,key_file_size,0))!=-1)
  656.         K_VIEWNAMES = parse_key_string(&file_mem[t]);
  657.     if((t=get_string_occurance("#K_VIEWHP",file_mem,key_file_size,0))!=-1)
  658.         K_VIEWHP = parse_key_string(&file_mem[t]);
  659.     if((t=get_string_occurance("#K_STATS",file_mem,key_file_size,0))!=-1)
  660.         K_STATS = parse_key_string(&file_mem[t]);
  661.     if((t=get_string_occurance("#K_QUESTLOG",file_mem,key_file_size,0))!=-1)
  662.         K_QUESTLOG = parse_key_string(&file_mem[t]);
  663.     if((t=get_string_occurance("#K_SESSION",file_mem,key_file_size,0))!=-1)
  664.         K_SESSION = parse_key_string(&file_mem[t]);
  665.     if((t=get_string_occurance("#K_WALK",file_mem,key_file_size,0))!=-1)
  666.         K_WALK = parse_key_string(&file_mem[t]);
  667.     if((t=get_string_occurance("#K_LOOK",file_mem,key_file_size,0))!=-1)
  668.         K_LOOK = parse_key_string(&file_mem[t]);
  669.     if((t=get_string_occurance("#K_USE",file_mem,key_file_size,0))!=-1)
  670.         K_USE = parse_key_string(&file_mem[t]);
  671.     if((t=get_string_occurance("#K_OPTIONS",file_mem,key_file_size,0))!=-1)
  672.         K_OPTIONS = parse_key_string(&file_mem[t]);
  673.     if((t=get_string_occurance("#K_REPEATSPELL",file_mem,key_file_size,0))!=-1)
  674.         K_REPEATSPELL = parse_key_string(&file_mem[t]);
  675.     if((t=get_string_occurance("#K_SIGILS",file_mem,key_file_size,0))!=-1)
  676.         K_SIGILS = parse_key_string(&file_mem[t]);
  677.     if((t=get_string_occurance("#K_MANUFACTURE",file_mem,key_file_size,0))!=-1)
  678.         K_MANUFACTURE = parse_key_string(&file_mem[t]);
  679.     if((t=get_string_occurance("#K_ITEMS",file_mem,key_file_size,0))!=-1)
  680.         K_ITEMS = parse_key_string(&file_mem[t]);
  681.     if((t=get_string_occurance("#K_MAP",file_mem,key_file_size,0))!=-1)
  682.         K_MAP = parse_key_string(&file_mem[t]);
  683.     if((t=get_string_occurance("#K_MINIMAP",file_mem,key_file_size,0))!=-1)
  684.         K_MINIMAP = parse_key_string(&file_mem[t]);
  685.     if((t=get_string_occurance("#K_ROTATELEFT",file_mem,key_file_size,0))!=-1)
  686.         K_ROTATELEFT = parse_key_string(&file_mem[t]);
  687.     if((t=get_string_occurance("#K_ROTATERIGHT",file_mem,key_file_size,0))!=-1)
  688.         K_ROTATERIGHT = parse_key_string(&file_mem[t]);
  689.     if((t=get_string_occurance("#K_FROTATELEFT",file_mem,key_file_size,0))!=-1)
  690.         K_FROTATELEFT = parse_key_string(&file_mem[t]);
  691.     if((t=get_string_occurance("#K_FROTATERIGHT",file_mem,key_file_size,0))!=-1)
  692.         K_FROTATERIGHT = parse_key_string(&file_mem[t]);
  693.     if((t=get_string_occurance("#K_BROWSER",file_mem,key_file_size,0))!=-1)
  694.         K_BROWSER = parse_key_string(&file_mem[t]);
  695.     if((t=get_string_occurance("#K_BROWSERWIN",file_mem,key_file_size,0))!=-1)
  696.         K_BROWSERWIN = parse_key_string(&file_mem[t]);
  697.     if((t=get_string_occurance("#K_ESCAPE",file_mem,key_file_size,0))!=-1)
  698.         K_ESCAPE = parse_key_string(&file_mem[t]);
  699.     if((t=get_string_occurance("#K_CONSOLE",file_mem,key_file_size,0))!=-1)
  700.         K_CONSOLE = parse_key_string(&file_mem[t]);
  701.     if((t=get_string_occurance("#K_SHADOWS",file_mem,key_file_size,0))!=-1)
  702.         K_SHADOWS = parse_key_string(&file_mem[t]);
  703.     if((t=get_string_occurance("#K_KNOWLEDGE",file_mem,key_file_size,0))!=-1)
  704.         K_KNOWLEDGE = parse_key_string(&file_mem[t]);
  705.     if((t=get_string_occurance("#K_ENCYCLOPEDIA",file_mem,key_file_size,0))!=-1)
  706.         K_ENCYCLOPEDIA = parse_key_string(&file_mem[t]);
  707.     if((t=get_string_occurance("#K_HELP",file_mem,key_file_size,0))!=-1)
  708.         K_HELP = parse_key_string(&file_mem[t]);
  709.     if((t=get_string_occurance("#K_NOTEPAD",file_mem,key_file_size,0))!=-1)
  710.         K_NOTEPAD = parse_key_string(&file_mem[t]);
  711.     if((t=get_string_occurance("#K_HIDEWINS",file_mem,key_file_size,0))!=-1)
  712.         K_HIDEWINS = parse_key_string(&file_mem[t]);
  713.     if((t=get_string_occurance("#K_ITEM1",file_mem,key_file_size,0))!=-1)
  714.         K_ITEM1 = parse_key_string(&file_mem[t]);
  715.     if((t=get_string_occurance("#K_ITEM2",file_mem,key_file_size,0))!=-1)
  716.         K_ITEM2 = parse_key_string(&file_mem[t]);
  717.     if((t=get_string_occurance("#K_ITEM3",file_mem,key_file_size,0))!=-1)
  718.         K_ITEM3 = parse_key_string(&file_mem[t]);
  719.     if((t=get_string_occurance("#K_ITEM4",file_mem,key_file_size,0))!=-1)
  720.         K_ITEM4 = parse_key_string(&file_mem[t]);
  721.     if((t=get_string_occurance("#K_ITEM5",file_mem,key_file_size,0))!=-1)
  722.         K_ITEM5 = parse_key_string(&file_mem[t]);
  723.     if((t=get_string_occurance("#K_ITEM6",file_mem,key_file_size,0))!=-1)
  724.         K_ITEM6 = parse_key_string(&file_mem[t]);
  725.     if((t=get_string_occurance("#K_ITEM7",file_mem,key_file_size,0))!=-1)
  726.         K_ITEM7 = parse_key_string(&file_mem[t]);
  727.     if((t=get_string_occurance("#K_ITEM8",file_mem,key_file_size,0))!=-1)
  728.         K_ITEM8 = parse_key_string(&file_mem[t]);
  729.     if((t=get_string_occurance("#K_ITEM9",file_mem,key_file_size,0))!=-1)
  730.         K_ITEM9 = parse_key_string(&file_mem[t]);
  731.     if((t=get_string_occurance("#K_ITEM10",file_mem,key_file_size,0))!=-1)
  732.         K_ITEM10 = parse_key_string(&file_mem[t]);
  733.     if((t=get_string_occurance("#K_ITEM11",file_mem,key_file_size,0))!=-1)
  734.         K_ITEM11 = parse_key_string(&file_mem[t]);
  735.     if((t=get_string_occurance("#K_ITEM12",file_mem,key_file_size,0))!=-1)
  736.         K_ITEM12 = parse_key_string(&file_mem[t]);
  737.     if((t=get_string_occurance("#K_SCREENSHOT",file_mem,key_file_size,0))!=-1)
  738.         K_SCREENSHOT = parse_key_string (&file_mem[t]);
  739.     if((t=get_string_occurance("#K_VIEWTEXTASOVERTEXT",file_mem,key_file_size,0))!=-1)
  740.         K_VIEWTEXTASOVERTEXT = parse_key_string(&file_mem[t]);
  741.     if((t=get_string_occurance("#K_AFK",file_mem,key_file_size,0))!=-1)
  742.         K_AFK = parse_key_string(&file_mem[t]);
  743.     if((t=get_string_occurance("#K_SIT",file_mem,key_file_size,0))!=-1)
  744.         K_SIT = parse_key_string(&file_mem[t]);
  745.     if((t=get_string_occurance("#K_RANGINGLOCK",file_mem,key_file_size,0))!=-1)
  746.         K_RANGINGLOCK = parse_key_string(&file_mem[t]);
  747.     if((t=get_string_occurance("#K_BUDDY",file_mem,key_file_size,0))!=-1)
  748.         K_BUDDY = parse_key_string(&file_mem[t]);
  749.     if((t=get_string_occurance("#K_NEXT_CHAT_TAB",file_mem,key_file_size,0))!=-1)
  750.         K_NEXT_CHAT_TAB = parse_key_string(&file_mem[t]);
  751.     if((t=get_string_occurance("#K_PREV_CHAT_TAB",file_mem,key_file_size,0))!=-1)
  752.         K_PREV_CHAT_TAB = parse_key_string(&file_mem[t]);
  753.     if((t=get_string_occurance("#K_RULES",file_mem,key_file_size,0))!=-1)
  754.         K_RULES = parse_key_string(&file_mem[t]);
  755.     if((t=get_string_occurance("#K_SPELL1",file_mem,key_file_size,0))!=-1)
  756.         K_SPELL1 = parse_key_string(&file_mem[t]);
  757.     if((t=get_string_occurance("#K_SPELL2",file_mem,key_file_size,0))!=-1)
  758.         K_SPELL2 = parse_key_string(&file_mem[t]);
  759.     if((t=get_string_occurance("#K_SPELL3",file_mem,key_file_size,0))!=-1)
  760.         K_SPELL3 = parse_key_string(&file_mem[t]);
  761.     if((t=get_string_occurance("#K_SPELL4",file_mem,key_file_size,0))!=-1)
  762.         K_SPELL4 = parse_key_string(&file_mem[t]);
  763.     if((t=get_string_occurance("#K_SPELL5",file_mem,key_file_size,0))!=-1)
  764.         K_SPELL5 = parse_key_string(&file_mem[t]);
  765.     if((t=get_string_occurance("#K_SPELL6",file_mem,key_file_size,0))!=-1)
  766.         K_SPELL6 = parse_key_string(&file_mem[t]);
  767.     if((t=get_string_occurance("#K_SPELL7",file_mem,key_file_size,0))!=-1)
  768.         K_SPELL7 = parse_key_string(&file_mem[t]);
  769.     if((t=get_string_occurance("#K_SPELL8",file_mem,key_file_size,0))!=-1)
  770.         K_SPELL8 = parse_key_string(&file_mem[t]);
  771.     if((t=get_string_occurance("#K_SPELL9",file_mem,key_file_size,0))!=-1)
  772.         K_SPELL9 = parse_key_string(&file_mem[t]);
  773.     if((t=get_string_occurance("#K_SPELL10",file_mem,key_file_size,0))!=-1)
  774.         K_SPELL10 = parse_key_string(&file_mem[t]);
  775.     if((t=get_string_occurance("#K_SPELL11",file_mem,key_file_size,0))!=-1)
  776.         K_SPELL11 = parse_key_string(&file_mem[t]);
  777.     if((t=get_string_occurance("#K_SPELL12",file_mem,key_file_size,0))!=-1)
  778.         K_SPELL12 = parse_key_string(&file_mem[t]);
  779.     if((t = get_string_occurance("#K_TABCOMPLETE",file_mem,key_file_size,0)) != -1)
  780.         K_TABCOMPLETE = parse_key_string(&file_mem[t]);
  781.     if((t = get_string_occurance("#K_WINDOWS_ON_TOP",file_mem,key_file_size,0)) != -1)
  782.         K_WINDOWS_ON_TOP = parse_key_string(&file_mem[t]);
  783.     if((t = get_string_occurance("#K_MARKFILTER",file_mem,key_file_size,0)) != -1)
  784.         K_MARKFILTER = parse_key_string(&file_mem[t]);
  785.     if((t = get_string_occurance("#K_OPAQUEWIN",file_mem,key_file_size,0)) != -1)
  786.         K_OPAQUEWIN = parse_key_string(&file_mem[t]);
  787.     if((t=get_string_occurance("#K_GRAB_MOUSE",file_mem,key_file_size,0))!=-1)
  788.         K_GRAB_MOUSE = parse_key_string(&file_mem[t]);
  789.     if((t=get_string_occurance("#K_FIRST_PERSON",file_mem,key_file_size,0))!=-1)
  790.         K_FIRST_PERSON = parse_key_string(&file_mem[t]);
  791.     if((t=get_string_occurance("#K_EXTEND_CAM",file_mem,key_file_size,0))!=-1)
  792.         K_EXTEND_CAM = parse_key_string(&file_mem[t]);
  793.     if((t=get_string_occurance("#K_EMOTES",file_mem,key_file_size,0))!=-1)
  794.         K_EMOTES = parse_key_string(&file_mem[t]);
  795.     if((t=get_string_occurance("#K_RANGINGWIN",file_mem,key_file_size,0))!=-1)
  796.         K_RANGINGWIN = parse_key_string(&file_mem[t]);
  797.  
  798.     free(file_mem);
  799. }
  800. #endif // FASTER_STARTUP
  801.  
  802. // Returns (in the buffer provided) a string describing the specified keydef.
  803. const char *get_key_string(Uint32 keydef, char *buf, size_t buflen)
  804. {
  805.     char base = keydef & 0xFF;
  806.     char *mod = "";
  807.     if (keydef & CTRL)
  808.         mod = "ctrl-";
  809.     else if (keydef & ALT)
  810.         mod = "alt-";
  811.     else if (keydef & SHIFT)
  812.         mod = "shift-";
  813.     safe_snprintf(buf, buflen, "%s%c", mod, base);
  814.     return buf;
  815. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement