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

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. // 
  4. // File: KStepLuaScript.cpp
  5. // Date: 2001-9-13 10:33:29
  6. // Code: Romandou
  7. // Desc:
  8. //---------------------------------------------------------------------------
  9. #include "KWin32.h"
  10. #include "KEngine.h"
  11. #include "KDebug.h"
  12. #include "KStepLuaScript.h"
  13. #include "LuaLib.h"
  14. #include "string.h"
  15. #include "KScriptList.h"
  16. #define CANCOMPILETOLUB //是否支持lub文件也就是为单机版服务的将某些指令IF 语句换成GOTO的功能
  17. //---------------------------------------------------------------------------
  18. // 函数: KStepLuaScript::KStepLuaScript
  19. // 功能:
  20. // 参数: void
  21. // 返回:
  22. //---------------------------------------------------------------------------
  23. KStepLuaScript::KStepLuaScript(void)
  24. {
  25. m_CurLine = 0;
  26. m_BufLen = 0;
  27. m_CurPos = 0;
  28. m_FirstExecuteLine = 0;
  29. m_EndExecuteLine = 0;
  30. m_pMsgQueue = NULL;
  31. strcpy(m_szWaitingMsg, "");
  32. }
  33. //---------------------------------------------------------------------------
  34. // 函数: KStepLuaScript::KStepLuaScript
  35. // 功能:
  36. // 参数: int StackSize
  37. // 返回:
  38. //---------------------------------------------------------------------------
  39. KStepLuaScript::KStepLuaScript(int StackSize = 0)
  40. {
  41. m_CurLine = 0;
  42. m_BufLen = 0;
  43. m_CurPos = 0;
  44. m_FirstExecuteLine = 0;
  45. m_EndExecuteLine = 0;
  46. m_pMsgQueue = NULL;
  47. }
  48. //---------------------------------------------------------------------------
  49. // 函数: KStepLuaScript::~KStepLuaScript
  50. // 功能:
  51. // 参数: void
  52. // 返回:
  53. //---------------------------------------------------------------------------
  54. KStepLuaScript::~KStepLuaScript(void)
  55. {
  56. m_Memory.Free();
  57. }
  58. BOOL KStepLuaScript::GetNextLine(LPBYTE lpByte, char * szLine)
  59. {
  60. long nCurPos;
  61. long i = 0;
  62. nCurPos = m_CurPos;
  63. while(1)
  64. {
  65. if (nCurPos >= m_BufLen)
  66. {
  67. szLine[i ++] = 13;
  68. szLine[i ++] = 'n';
  69. break;
  70. }
  71. if (lpByte[nCurPos] == 'n')
  72. {
  73. if (i == 0) {nCurPos++; continue;}
  74. szLine[i] = 'n';
  75. break;
  76. }
  77. szLine[i ++] = lpByte[nCurPos++];
  78. }
  79. if (i)
  80. {
  81. szLine[i] = ''; // i - 1 old
  82. m_CurPos = nCurPos + 1;
  83. return TRUE;
  84. }
  85. return FALSE;
  86. }
  87. BOOL KStepLuaScript::Load(LPSTR szFileName)
  88. {
  89. if (!szFileName)
  90. return FALSE;
  91. strcpy(m_szFilename,szFileName);
  92. SetScriptName( szFileName);
  93. #ifdef CANCOMPILETOLUB
  94. KLubCmpl_Blocker blocker;
  95. KLineNode * pIfLine = blocker.Load(szFileName);
  96. KLineNode * pExitLine = new KLineNode; 
  97. char  szExit[10];
  98. strcpy(szExit,"Exit();n");
  99. pExitLine->m_pLineMem = new KMemClass1;
  100. pExitLine->m_pLineMem->Alloc(strlen(szExit));
  101. strcpy((char *)pExitLine->m_pLineMem->GetMemPtr(), szExit);
  102. blocker.m_Lines.AddTail(pExitLine);
  103. blocker.ScanIf(pIfLine);
  104. KMemClass1 * pMem = NULL;
  105. int len = blocker.GetBuffer(pMem);
  106. if (len == 0) return FALSE;
  107. if (!GetExeBuffer(pMem->GetMemPtr(), len)) return FALSE;
  108. if (!KLuaScript::LoadBuffer((PBYTE)m_Memory.GetMemPtr(), len )) return FALSE;
  109. if (!ExecuteCode()) return FALSE;
  110. delete pExitLine;
  111. delete pMem;
  112. #else
  113. if (!GetExeBufferFromFile(szFileName))  return FALSE;
  114. if (!KLuaScript::LoadBuffer((PBYTE)m_Memory.GetMemPtr(), m_BufLen - 1))
  115. if (!ExecuteCode()) return FALSE;
  116. #endif
  117. return TRUE;
  118. }
  119. //执行该行语句
  120. BOOL KStepLuaScript::ExeLine(LPSTR szLine)
  121. {
  122. if (szLine)
  123. {
  124. if (lua_dostring(m_LuaState, szLine) == 0) return TRUE;
  125. }
  126. return FALSE;
  127. }
  128. BOOL KStepLuaScript::CheckLine(LPSTR szLine)//检查将执行的Lua语句是否符合条件,如不能有for goto 
  129. {
  130. return TRUE;
  131. }
  132. BOOL KStepLuaScript::GetExeBufferFromFile(char * FileName)//获得当前文件中执行段的语句
  133. {
  134. KPakFile File;
  135. DWORD Size;
  136. // open file
  137. if (!File.Open(FileName))
  138. return FALSE;
  139. // get file size
  140. Size = File.Size();
  141. // alloc memory
  142. if (! m_Memory.Alloc(Size))
  143. return FALSE;
  144. // read file
  145. if (File.Read(m_Memory.GetMemPtr(), Size) != Size)
  146. return FALSE;
  147. File.Close();
  148. ((char*)m_Memory.GetMemPtr())[Size] = 13;
  149.     ((char*)m_Memory.GetMemPtr())[Size + 1] = 'n';
  150. ((char*)m_Memory.GetMemPtr())[Size + 2] = 0;
  151. // set buffer length
  152. m_BufLen = Size + 3;//m_Memory.GetMemLen();
  153. // set cursor position
  154. m_CurPos = 0;
  155. char szLine[100];
  156. long nCurPos = 0;
  157. LPBYTE lpByte;
  158. lpByte = (LPBYTE) m_Memory.GetMemPtr();
  159. while(1)
  160. {
  161. nCurPos = m_CurPos;
  162. if (!GetNextLine(lpByte, szLine))
  163. break;
  164. if(strstr(szLine,MainBlockBeginString))
  165. {
  166. m_FirstExecuteLine = m_CurPos;
  167. break;
  168. }
  169. }
  170. while(1)
  171. {
  172. nCurPos = m_CurPos;
  173. if (!GetNextLine(lpByte, szLine))
  174. break;
  175. if(strstr(szLine,MainBlockEndString))
  176. {
  177. m_EndExecuteLine = nCurPos;
  178. break;
  179. }
  180. }
  181. if ((m_FirstExecuteLine * m_EndExecuteLine) == 0)
  182. return FALSE;
  183. return TRUE;
  184. }
  185. //从Buffer中获得代码
  186. BOOL KStepLuaScript::GetExeBuffer(void * szScriptBuffer, int nLen)//获得执行段的语句
  187. {
  188. char szLine[100];
  189. long nCurPos = 0;
  190. LPBYTE lpByte;
  191. long Size = nLen;
  192. m_BufLen = Size + 3;//m_Memory.GetMemLen();
  193. if (!m_Memory.Alloc(Size+16))
  194. return FALSE;
  195. g_MemCopy(m_Memory.GetMemPtr(), szScriptBuffer, nLen);
  196. lpByte = (LPBYTE)m_Memory.GetMemPtr();
  197. m_CurPos = 0;
  198. while(1)
  199. {
  200. nCurPos = m_CurPos;
  201. if (!GetNextLine(lpByte, szLine))
  202. break;
  203. if(strstr(szLine,MainBlockBeginString))
  204. {
  205. m_FirstExecuteLine = m_CurPos;
  206. break;
  207. }
  208. }
  209. while(1)
  210. {
  211. nCurPos = m_CurPos;
  212. if (!GetNextLine(lpByte, szLine))
  213. break;
  214. if(strstr(szLine,MainBlockEndString))
  215. {
  216. m_EndExecuteLine = nCurPos;
  217. break;
  218. }
  219. }
  220. if ((m_FirstExecuteLine * m_EndExecuteLine) == 0)
  221. return FALSE;
  222. return TRUE;
  223. }
  224. int KStepLuaScript::Active()
  225. {
  226. char szLine[100];
  227. long nCurPos = 0;
  228. int index = 0;
  229. TScriptMsg * pNode = m_pMsgQueue;
  230. while(pNode)
  231. {
  232. char MsgFuncName[40];
  233. sprintf(MsgFuncName, "On%s", (char *)pNode->szMessage);
  234. if (!CallFunction(MsgFuncName, 0, "ds", (unsigned int)pNode->StateAddr,  pNode->szMsgData))
  235. {
  236. ;
  237. }
  238. if (IsRunWaitMsg())
  239. {
  240. if (!strcmp(pNode->szMessage, m_szWaitingMsg))
  241. RunMain();
  242. }
  243. TScriptMsg * pNode1 = pNode;
  244. pNode = pNode->NextMsg;
  245. delete pNode1;
  246. }
  247. m_pMsgQueue = NULL;
  248. if (IsRunIdle()) return 1;
  249. static int ii = 0;
  250. while(m_CurPos < m_EndExecuteLine && m_CurPos >= m_FirstExecuteLine)
  251. {
  252. nCurPos = m_CurPos;
  253. //等待消息中....
  254. if (IsRunWaitMsg()) return 0;
  255. if (GetNextLine((LPBYTE )m_Memory.GetMemPtr(), szLine))
  256. {
  257. lua_dostring(m_LuaState, szLine);
  258. lua_settop(m_LuaState, 0);
  259. }
  260. //还在执行某个语句时如npcgo,
  261. if (IsRunFunc())
  262. {
  263. m_CurPos = nCurPos;
  264. return 0;
  265. }
  266. if (IsRunResume())
  267. {
  268. RunMain();
  269. return 0;
  270. }
  271. if (IsRunIdle()) return 1;
  272. }
  273. RunIdle();
  274. return 1 ;
  275. }
  276. //上一行
  277. void KStepLuaScript::PosUp()
  278. {
  279. int nCurPos = m_CurPos - 2;
  280. long i = 0;
  281. if (nCurPos <= 0)  return;
  282. LPBYTE lpByte = (LPBYTE )m_Memory.GetMemPtr();
  283. while(nCurPos > 0)
  284. {
  285. if (lpByte[nCurPos --] == 'n')
  286. break;
  287. }
  288. m_CurPos = nCurPos + 2;
  289. }
  290. void KStepLuaScript::GotoLabel( LPSTR szLabelName)
  291. {
  292. int nCurPos = m_FirstExecuteLine;
  293. LPSTR lpByte = (LPSTR )m_Memory.GetMemPtr();
  294. char szLabel[50];
  295. sprintf(szLabel, "Label("%s")",szLabelName);
  296. char * szindex = strstr(lpByte,szLabel);
  297. if (szindex == NULL)
  298. {
  299. g_MessageBox("脚本错误: GotoLabel() = %s", szLabelName);
  300. return;
  301. }
  302. m_CurPos = szindex - lpByte;
  303. char  szLine[50];
  304. GetNextLine((LPBYTE)lpByte, szLine);
  305. }
  306. BOOL    KStepLuaScript::AddMessage(Lua_State * L, char * MessageName, char * szData)
  307. {
  308. if (strlen(MessageName) == 0)
  309. return FALSE;
  310. TScriptMsg * pMsg = new TScriptMsg;
  311. pMsg->szMessage = MessageName ;
  312. pMsg->szMsgData = szData;
  313. pMsg->StateAddr = L;
  314. pMsg->NextMsg = NULL;
  315. if (m_pMsgQueue == NULL)
  316. {
  317. m_pMsgQueue = pMsg;
  318. }
  319. else 
  320. {
  321. TScriptMsg * pNode = m_pMsgQueue;
  322. while(pNode)
  323. {
  324. TScriptMsg * pNode1 = pNode;
  325. pNode = pNode->NextMsg;
  326. if (pNode == NULL)
  327. {
  328. pNode1->NextMsg = pMsg;
  329. break;
  330. }
  331. }
  332. }
  333. return TRUE;
  334. }
  335. BOOL KStepLuaScript::SendMessage(KStepLuaScript * pSendedScript, char * szMessageName, char * szData)
  336. {
  337. if (pSendedScript == NULL)
  338. return FALSE;
  339. return pSendedScript->AddMessage( m_LuaState ,szMessageName, szData);
  340. }