KMath.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:9k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "KCore.h"
  2. #include <math.h>
  3. #include "GameDataDef.h"
  4. #include "KMath.h"
  5. #ifdef WIN32
  6. #define _USBKEY
  7. #endif
  8. #ifdef _USBKEY
  9.     #include "USBKey/epsJO.h" 
  10.     //---------------------------------------------------------------------------
  11.     // 正弦表 (将浮点数 *1024 整型化)
  12.     int *g_nSin = NULL;
  13.     // 余弦表 (将浮点数 *1024 整型化)
  14.     int *g_nCos = NULL;
  15.     // 正弦余弦的查表函数代码缓冲区
  16.     unsigned char *g_InternalDirSinCosCode = NULL;
  17.     //---------------------------------------------------------------------------
  18.     // 五行相生相克
  19.     // 五行相生相克函数代码缓冲区
  20.     unsigned char *g_InternalIsAccrueConquerCode = NULL;
  21.     //---------------------------------------------------------------------------
  22.     int g_nEPJInitFlag = false;
  23.     // {982CD92C-027E-4638-8BD4-5855FFB6DCC1}
  24. const unsigned char g_cExeData[16] = { 
  25.         0x98, 0x2c, 0xd9, 0x2c, 0x02, 0x7e, 0x46, 0x38, 
  26.         0x8b, 0xd4, 0x58, 0x55, 0xff, 0xb6, 0xdc, 0xc1 
  27.     };
  28.     int _ReadDataFromUSBKey(int nSize, unsigned char abyBuffer[], int *pnRetSize, int nIndex)
  29.     {
  30.         int nResult  = false;
  31.         int nRetCode = false;
  32. int   nReadSize = 0;
  33. unsigned char *pbyReadBuf = NULL;
  34.         if (pnRetSize)
  35.             *pnRetSize = 0;
  36.         if (nSize <= 0)
  37.             goto Exit0;
  38.         if (!abyBuffer)
  39.             goto Exit0;
  40.         
  41.         if (nIndex < 0)
  42.             goto Exit0;
  43. nRetCode = epj_ReadKeyCode(
  44.             (const char *)g_cExeData, sizeof(g_cExeData),
  45.             (char **)(&pbyReadBuf), &nReadSize,
  46.             nIndex
  47.         );
  48.         if (!nRetCode)
  49.             goto Exit0;
  50.         
  51.         if (!pbyReadBuf)
  52.             goto Exit0;
  53.         if (nReadSize <= 0)
  54.             goto Exit0;
  55.         if (nReadSize > nSize)
  56.             goto Exit0;
  57.         memcpy(abyBuffer, pbyReadBuf, nReadSize);
  58.         if (pnRetSize)
  59.             *pnRetSize = nReadSize;
  60.         free(pbyReadBuf);
  61.         pbyReadBuf = NULL;
  62.         nReadSize  = 0;
  63.         nResult = true;
  64.     Exit0:
  65.         return nResult;
  66.     }
  67.     int g_InitMath()
  68.     {
  69.         int nResult = false;
  70.         int nRetCode = false;
  71.         if (g_nEPJInitFlag)
  72.             goto Exit1;
  73.         g_nSin = new int [1024 / sizeof(int)];
  74.         if (!g_nSin)
  75.             goto Exit0;
  76.         g_nCos = new int [1024 / sizeof(int)];
  77.         if (!g_nCos)
  78.             goto Exit0;
  79.         g_InternalDirSinCosCode = new unsigned char [1024];
  80.         if (!g_InternalDirSinCosCode)
  81.             goto Exit0;
  82.         g_InternalIsAccrueConquerCode = new unsigned char [1024];
  83.         if (!g_InternalIsAccrueConquerCode)
  84.             goto Exit0;
  85.         // 这个时候开始从USBKey中读入相应的数据
  86.     nRetCode = epj_Init("rockey");
  87.         if (!nRetCode)
  88.             goto Exit0;
  89.         g_nEPJInitFlag = true;
  90.         nRetCode = _ReadDataFromUSBKey(
  91.             1024, (unsigned char *)g_nSin, NULL, 
  92.             0
  93.         );
  94.         if (!nRetCode)
  95.             goto Exit0;
  96.         nRetCode = _ReadDataFromUSBKey(
  97.             1024, (unsigned char *)g_nCos, NULL, 
  98.             1
  99.         );
  100.         if (!nRetCode)
  101.             goto Exit0;
  102.         
  103.         nRetCode = _ReadDataFromUSBKey(
  104.             1024, (unsigned char *)g_InternalDirSinCosCode, NULL, 
  105.             2
  106.         );
  107.         if (!nRetCode)
  108.             goto Exit0;
  109.         
  110.         nRetCode = _ReadDataFromUSBKey(
  111.             1024, (unsigned char *)g_InternalIsAccrueConquerCode, NULL, 
  112.             3
  113.         );
  114.         if (!nRetCode)
  115.             goto Exit0;
  116.     Exit1:
  117.         nResult = true;
  118.     Exit0:
  119.         if (!nResult)
  120.         {
  121.             if (g_nEPJInitFlag)
  122.             {
  123.                 epj_UnInit();
  124.                 g_nEPJInitFlag = false;
  125.             }
  126.             if (g_InternalIsAccrueConquerCode)
  127.             {
  128.                 delete []g_InternalIsAccrueConquerCode;
  129.                 g_InternalIsAccrueConquerCode = NULL;
  130.             }
  131.             if (g_InternalDirSinCosCode)
  132.             {
  133.                 delete []g_InternalDirSinCosCode;
  134.                 g_InternalDirSinCosCode = NULL;
  135.             }
  136.             if (g_nCos)
  137.             {
  138.                 delete []g_nCos;
  139.                 g_nCos = NULL;
  140.             }
  141.             if (g_nSin)
  142.             {
  143.                 delete []g_nSin;
  144.                 g_nSin = NULL;
  145.             }
  146.         }
  147.         return nResult;
  148.     }
  149.     int g_UnInitMath()
  150.     {
  151.         int nResult = false;
  152.         if (g_nEPJInitFlag)
  153.         {
  154.             epj_UnInit();
  155.             g_nEPJInitFlag = false;
  156.         }
  157.         if (g_InternalIsAccrueConquerCode)
  158.         {
  159.             delete []g_InternalIsAccrueConquerCode;
  160.             g_InternalIsAccrueConquerCode = NULL;
  161.         }
  162.         if (g_InternalDirSinCosCode)
  163.         {
  164.             delete []g_InternalDirSinCosCode;
  165.             g_InternalDirSinCosCode = NULL;
  166.         }
  167.         if (g_nCos)
  168.         {
  169.             delete []g_nCos;
  170.             g_nCos = NULL;
  171.         }
  172.         if (g_nSin)
  173.         {
  174.             delete []g_nSin;
  175.             g_nSin = NULL;
  176.         }
  177.         nResult = true;
  178.     //Exit0:
  179.         return nResult;
  180.     }
  181. #else
  182. // 不需要加载USBKey
  183.     // 正弦表 (将浮点数 *1024 整型化)
  184.     int g_nSinBuffer[64] = 
  185.     {
  186.     1024, 1019, 1004, 979, 946, 903, 851, 791,
  187.         724, 649, 568, 482, 391, 297, 199, 100,
  188.         0,    -100, -199, -297, -391, -482, -568, -649,
  189.         -724, -791, -851, -903, -946, -979, -1004, -1019,
  190.         -1024, -1019, -1004, -979, -946, -903, -851, -791,
  191.         -724, -649, -568, -482, -391, -297, -199, -100,
  192.         0,      100, 199, 297, 391, 482, 568, 649,
  193.         724, 791, 851, 903, 946, 979, 1004, 1019
  194.     };
  195.     //---------------------------------------------------------------------------
  196.     // 余弦表 (将浮点数 *1024 整型化)
  197.     int g_nCosBuffer[64] = 
  198.     {
  199.     0,     -100, -199, -297, -391, -482, -568, -649,
  200.         -724, -791, -851, -903, -946, -979, -1004, -1019,
  201.         -1024, -1019, -1004, -979, -946, -903, -851, -791,
  202.         -724, -649, -568, -482, -391, -297, -199, -100,
  203.         0,      100, 199, 297, 391, 482, 568, 649,
  204.         724, 791, 851, 903, 946, 979, 1004, 1019,
  205.         1024, 1019, 1004, 979, 946, 903, 851, 791,
  206.         724, 649, 568, 482, 391, 297, 199, 100,
  207.     };
  208.     // 正弦余弦的查表函数代码缓冲区
  209.     unsigned char g_InternalDirSinCosCodeBuffer[] =
  210.     {
  211.         0x8B, 0x44, 0x24, 0x08, 0x85, 0xC0, 0x7C, 0x16, 
  212.         0x8B, 0x4C, 0x24, 0x0C, 0x3B, 0xC1, 0x7D, 0x0E, 
  213.         0xC1, 0xE0, 0x06, 0x99, 0xF7, 0xF9, 0x8B, 0x4C, 
  214.         0x24, 0x04, 0x8B, 0x04, 0x81, 0xC3, 0x83, 0xC8, 
  215.         0xFF, 0xC3
  216.     };
  217.     // 正弦余弦的查表函数代码
  218.     //int __cdecl g_InternalDirSinCos(int pSinCosTable[], int nDir, int nMaxDir)
  219.     //{
  220.     // if (nDir < 0 || nDir >= nMaxDir)
  221.     // return -1;
  222.     //
  223.     // int nIndex = (nDir << 6) / nMaxDir;
  224.     //
  225.     // return pSinCosTable[nIndex];
  226.     //}
  227.     // 五行相生相克函数代码缓冲区
  228.     unsigned char g_InternalIsAccrueConquerCodeBuffer[] =
  229.     {
  230.         0x8B, 0x44, 0x24, 0x08, 0x85, 0xC0, 0x7C, 0x1E, 
  231.         0x83, 0xF8, 0x05, 0x7D, 0x19, 0x8B, 0x54, 0x24, 
  232.         0x0C, 0x56, 0x8B, 0x74, 0x24, 0x08, 0x57, 0x33, 
  233.         0xC9, 0x8B, 0x3C, 0x86, 0x3B, 0xD7, 0x5F, 0x0F, 
  234.         0x94, 0xC1, 0x8B, 0xC1, 0x5E, 0xC3, 0x33, 0xC0, 
  235.         0xC3
  236.     };
  237.     // 五行相生相克函数代码
  238.     //int __cdecl g_InternalIsAccrueConquer(int pAccrueConquerTable[], int nSrcSeries, int nDesSeries)
  239.     //{
  240.     // if (nSrcSeries < 0 || nSrcSeries >= series_num)
  241.     // return false;
  242.     //
  243.     // return (nDesSeries == pAccrueConquerTable[nSrcSeries]);
  244.     //}
  245.     //---------------------------------------------------------------------------
  246.     // 正弦表 (将浮点数 *1024 整型化)
  247.     int *g_nSin = g_nSinBuffer;
  248.     // 余弦表 (将浮点数 *1024 整型化)
  249.     int *g_nCos = g_nCosBuffer;
  250.     // 正弦余弦的查表函数代码缓冲区
  251.     unsigned char *g_InternalDirSinCosCode = g_InternalDirSinCosCodeBuffer;
  252.     //---------------------------------------------------------------------------
  253.     // 五行相生相克
  254.     // 五行相生相克函数代码缓冲区
  255.     unsigned char *g_InternalIsAccrueConquerCode = g_InternalIsAccrueConquerCodeBuffer;
  256.     //---------------------------------------------------------------------------
  257.     int g_InitMath()
  258.     {
  259.         return true;
  260.     }
  261.     int g_UnInitMath()
  262.     {
  263.         return true;
  264.     }
  265. #endif
  266. //---------------------------------------------------------------------------
  267. // 五行相生相克
  268. int g_nAccrueSeries[series_num];
  269. int g_nConquerSeries[series_num];
  270. void g_InitSeries()
  271. {
  272. g_nAccrueSeries[series_metal] = series_water;
  273. g_nConquerSeries[series_metal] = series_wood;
  274. g_nAccrueSeries[series_wood] = series_fire;
  275. g_nConquerSeries[series_wood] = series_earth;
  276. g_nAccrueSeries[series_water] = series_wood;
  277. g_nConquerSeries[series_water] = series_fire;
  278. g_nAccrueSeries[series_fire] = series_earth;
  279. g_nConquerSeries[series_fire] = series_metal;
  280. g_nAccrueSeries[series_earth] = series_metal;
  281. g_nConquerSeries[series_earth] = series_water;
  282. }