2020-06-23 15:53:23 +08:00
|
|
|
|
#include "../systeminc/version.h"
|
2020-06-23 15:27:59 +08:00
|
|
|
|
#include "../systeminc/system.h"
|
|
|
|
|
#include "../wgs/tea.h"
|
|
|
|
|
#include "../systeminc/action.h"
|
|
|
|
|
#include "../newproto/autil.h"
|
|
|
|
|
#include "winlua.h"
|
|
|
|
|
#include <locale.h>
|
|
|
|
|
#include <io.h>
|
|
|
|
|
#ifdef _WIN_LUAJIT_
|
|
|
|
|
static const char *progname = "lua";
|
|
|
|
|
MY_Lua MYLua;
|
|
|
|
|
lua_State* FindWinIntLua( int wintype, char *data )
|
|
|
|
|
{
|
|
|
|
|
lua_State *lua = NULL;
|
|
|
|
|
if (lua == NULL){
|
|
|
|
|
char filename[256];
|
|
|
|
|
#ifdef _RELUA_
|
|
|
|
|
sprintf_s(filename, "%s//win//%d.lua", _LUA_PATCH_, wintype);
|
|
|
|
|
#else
|
|
|
|
|
#ifdef _SA_VERSION_25
|
|
|
|
|
sprintf_s(filename, "%s//win//%d.es", _LUA_PATCH_, wintype);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
lua = FindLua(filename);
|
|
|
|
|
if (lua == NULL)return NULL;
|
|
|
|
|
}
|
|
|
|
|
lua_getglobal(lua, "WindowInit");
|
|
|
|
|
if (!lua_isfunction(lua, -1)){
|
|
|
|
|
lua_pop(lua, 1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
lua_pushstring(lua, data);
|
|
|
|
|
docall(lua, 1, 1);
|
|
|
|
|
return lua;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ACTION * FreeCreateWinTypeLua( lua_State *lua )
|
|
|
|
|
{
|
|
|
|
|
if (lua == NULL){
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lua_getglobal(lua, "CreateWinType");
|
|
|
|
|
|
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
|
|
|
|
lua_pop(lua, 1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int TM_Ret = lua_pcall(lua, 0, 1, 0);
|
|
|
|
|
|
|
|
|
|
if (TM_Ret != 0){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
printf("入口:FreeCreateWinTypeLua 错误内容:%d(%s)\n", TM_Ret, lua_tostring(lua, -1));
|
2020-06-23 15:27:59 +08:00
|
|
|
|
lua_pop(lua, 1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!lua_isnumber(lua, -1))
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
int ret = (int)lua_tonumber(lua, -1);
|
|
|
|
|
|
|
|
|
|
lua_pop(lua, 1);
|
|
|
|
|
|
|
|
|
|
return (ACTION *)ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ACTION * FreeServerWinTypeLua( lua_State *lua )
|
|
|
|
|
{
|
|
|
|
|
if (lua == NULL){
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
lua_getglobal(lua, "ServerWindowType");
|
|
|
|
|
int TM_Ret = lua_pcall(lua, 0, 1, 0);
|
|
|
|
|
|
|
|
|
|
if (TM_Ret != 0){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
printf("入口:FreeServerWinTypeLua 错误内容:%d(%s)\n", TM_Ret, lua_tostring(lua, -1));
|
2020-06-23 15:27:59 +08:00
|
|
|
|
lua_pop(lua, 1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
if (!lua_isnumber(lua, -1))
|
|
|
|
|
return NULL;
|
|
|
|
|
int ret = (int)lua_tonumber(lua, -1);
|
|
|
|
|
lua_pop(lua, 1);
|
|
|
|
|
return (ACTION *)ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const luaL_Reg lualibs[] = {
|
|
|
|
|
{"Win", luaopen_Win},
|
|
|
|
|
{"lssproto", luaopen_Lssproto},
|
|
|
|
|
{"sa", luaopen_Sa},
|
|
|
|
|
{"ServerList", luaopen_ServerList},
|
|
|
|
|
{"data", luaopen_Data},
|
|
|
|
|
{NULL, NULL}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
LUALIB_API void luaAB_openlibs (lua_State *L) {
|
|
|
|
|
const luaL_Reg *lib = lualibs;
|
|
|
|
|
for (; lib->func; lib++) {
|
|
|
|
|
lua_pushcfunction(L, lib->func);
|
|
|
|
|
lua_pushstring(L, lib->name);
|
|
|
|
|
lua_call(L, 1, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int getArrayInt(lua_State *L, int idx) {
|
|
|
|
|
int result = 0;
|
|
|
|
|
lua_pushnumber(L, idx + 1);
|
|
|
|
|
lua_gettable(L, -2);
|
|
|
|
|
result = (int)lua_tonumber(L, -1);
|
|
|
|
|
lua_pop(L, 1);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void l_message (const char *pname, const char *msg) {
|
|
|
|
|
if (pname) fprintf(stderr, "%s: ", pname);
|
|
|
|
|
fprintf(stderr, "%s\n", msg);
|
|
|
|
|
fflush(stderr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int report (lua_State *L, int status) {
|
|
|
|
|
if (status && !lua_isnil(L, -1)) {
|
|
|
|
|
const char *msg = lua_tostring(L, -1);
|
|
|
|
|
if (msg == NULL) msg = "(error object is not a string)";
|
|
|
|
|
l_message(progname, msg);
|
|
|
|
|
lua_pop(L, 1);
|
|
|
|
|
}
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int traceback (lua_State *L) {
|
|
|
|
|
if (!lua_isstring(L, 1)) /* 'message' not a string? */
|
|
|
|
|
return 1; /* keep it intact */
|
|
|
|
|
lua_getfield(L, LUA_GLOBALSINDEX, "debug");
|
|
|
|
|
if (!lua_istable(L, -1)) {
|
|
|
|
|
lua_pop(L, 1);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
lua_getfield(L, -1, "traceback");
|
|
|
|
|
if (!lua_isfunction(L, -1)) {
|
|
|
|
|
lua_pop(L, 2);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
lua_pushvalue(L, 1); /* pass error message */
|
|
|
|
|
lua_pushinteger(L, 2); /* skip this function and traceback */
|
|
|
|
|
lua_call(L, 2, 1); /* call debug.traceback */
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int docall (lua_State *L, int narg, int clear) {
|
|
|
|
|
int status;
|
|
|
|
|
int base = lua_gettop(L) - narg; /* function index */
|
|
|
|
|
lua_pushcfunction(L, traceback); /* push traceback function */
|
|
|
|
|
lua_insert(L, base); /* put it under chunk and args */
|
|
|
|
|
status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base);
|
|
|
|
|
lua_remove(L, base);
|
|
|
|
|
if(status != 0){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
printf("入口:docall 错误内容:%d(%s)\n", status, lua_tostring(L, -1));
|
2020-06-23 15:27:59 +08:00
|
|
|
|
int iTop = lua_gettop(L);
|
|
|
|
|
lua_pop(L,iTop);
|
|
|
|
|
lua_gc(L, LUA_GCCOLLECT, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int dofile (lua_State *L, const char *name) {
|
|
|
|
|
int status = luaL_loadfile(L, name) || docall(L, 0, 1);
|
|
|
|
|
return report(L, status);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int decryptLUA(lua_State *L, char *filename){
|
|
|
|
|
FILE *f;
|
|
|
|
|
char loadfilename[256];
|
|
|
|
|
int luamaxlen = 0;
|
|
|
|
|
unsigned char *luabuff;
|
|
|
|
|
strcpy(loadfilename, filename);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
fopen_s(&f,loadfilename,"rb");//打开补丁1
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if (f!=NULL){
|
|
|
|
|
fseek(f,0,SEEK_END);
|
|
|
|
|
luamaxlen = ftell(f);
|
|
|
|
|
luabuff = (unsigned char*)malloc(luamaxlen+1);
|
|
|
|
|
fseek(f,0,SEEK_SET);
|
|
|
|
|
fread(luabuff, 1, luamaxlen, f);
|
|
|
|
|
fclose(f);
|
|
|
|
|
luabuff[luamaxlen]=0;
|
|
|
|
|
}else{
|
|
|
|
|
return -100;
|
|
|
|
|
}
|
2020-06-23 15:53:23 +08:00
|
|
|
|
TEA解密((long*)luabuff,(luamaxlen/4),(long *)_LUA_KEY_);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
int status = luaL_dostring(L,(const char *)luabuff);
|
|
|
|
|
free(luabuff);
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int myluaload (char *filename)
|
|
|
|
|
{
|
|
|
|
|
MY_Lua *salua = &MYLua;
|
|
|
|
|
while(salua->next!=NULL){
|
|
|
|
|
if(strcmp(salua->luapath, filename) == 0){
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
salua = salua->next;
|
|
|
|
|
}
|
|
|
|
|
salua->luapath = new char[strlen(filename)+1];
|
|
|
|
|
memset( salua->luapath, 0 , strlen(filename)+1);
|
|
|
|
|
strcpy(salua->luapath, filename);
|
|
|
|
|
salua->next = (tagMYLua *)new MY_Lua;
|
|
|
|
|
memset( salua->next, 0 , sizeof(MY_Lua) );
|
|
|
|
|
if(salua->next == NULL)return EXIT_FAILURE;
|
|
|
|
|
|
|
|
|
|
salua->lua = lua_open();
|
|
|
|
|
if (salua->lua == NULL) {
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
lua_gc(salua->lua, LUA_GCSTOP, 0);
|
|
|
|
|
luaL_openlibs(salua->lua);
|
|
|
|
|
luaAB_openlibs(salua->lua);
|
|
|
|
|
lua_gc(salua->lua, LUA_GCRESTART, 0);
|
|
|
|
|
#ifdef _RELUA_
|
|
|
|
|
int re = dofile(salua->lua, filename);
|
|
|
|
|
if(re!=0){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
printf("文件:%s 错误提示:%s 行数:%d\n",filename,(char *)lua_tostring(salua->lua, -1),re);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
lua_gc(salua->lua, LUA_GCCOLLECT, 0);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
int re = decryptLUA(salua->lua, filename);
|
|
|
|
|
if(re != 0){
|
|
|
|
|
if(re==-100) return TRUE;
|
2020-06-23 15:53:23 +08:00
|
|
|
|
printf("文件:%s 错误提示:%s 行数:%d\n",filename,(char *)lua_tostring(salua->lua, -1),re);
|
2020-06-23 15:27:59 +08:00
|
|
|
|
lua_gc(salua->lua, LUA_GCCOLLECT, 0);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
lua_getglobal(salua->lua, "main");
|
|
|
|
|
if (lua_isfunction(salua->lua, -1)) {
|
|
|
|
|
docall(salua->lua, 0, 1);
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int remyluaload (char *filename)
|
|
|
|
|
{
|
|
|
|
|
MY_Lua *salua = &MYLua;
|
|
|
|
|
|
|
|
|
|
while(salua->next!=NULL){
|
|
|
|
|
if(strlen(salua->luapath) > 0){
|
|
|
|
|
if(strlen(filename)>0){
|
|
|
|
|
if(strstr(salua->luapath, filename) == 0){
|
|
|
|
|
salua = salua->next;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
lua_gc(salua->lua, LUA_GCSTOP, 0);
|
|
|
|
|
luaL_openlibs(salua->lua);
|
|
|
|
|
luaAB_openlibs(salua->lua);
|
|
|
|
|
lua_gc(salua->lua, LUA_GCRESTART, 0);
|
|
|
|
|
dofile(salua->lua, salua->luapath);
|
|
|
|
|
lua_getglobal(salua->lua, "data");
|
|
|
|
|
if (lua_isfunction(salua->lua, -1)) {
|
|
|
|
|
docall(salua->lua, 0, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
salua = salua->next;
|
|
|
|
|
}
|
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int closemyluaload()
|
|
|
|
|
{
|
|
|
|
|
MY_Lua *salua = &MYLua;
|
|
|
|
|
while(salua->next!=NULL){
|
|
|
|
|
lua_pop(salua->lua, 1);
|
|
|
|
|
lua_close(salua->lua);
|
|
|
|
|
salua = salua->next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void LoadStoneAgeLUA(char *path)
|
|
|
|
|
{
|
|
|
|
|
char filename[256];
|
|
|
|
|
|
|
|
|
|
WIN32_FIND_DATA wfd;
|
|
|
|
|
HANDLE hFind;
|
|
|
|
|
lstrcpy(filename, path);
|
|
|
|
|
lstrcat(filename, "/");
|
2020-06-23 15:53:23 +08:00
|
|
|
|
lstrcat(filename, "*.*"); // 找所有文件
|
2020-06-23 15:27:59 +08:00
|
|
|
|
|
|
|
|
|
hFind = FindFirstFile(filename, &wfd);
|
2020-06-23 15:53:23 +08:00
|
|
|
|
if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败
|
2020-06-23 15:27:59 +08:00
|
|
|
|
return;
|
|
|
|
|
do{
|
|
|
|
|
|
|
|
|
|
if (wfd.cFileName[0] == '.')
|
2020-06-23 15:53:23 +08:00
|
|
|
|
continue; // 过滤这两个目录
|
2020-06-23 15:27:59 +08:00
|
|
|
|
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
|
|
|
{
|
|
|
|
|
sprintf_s(filename, "%s//%s", path, wfd.cFileName);
|
|
|
|
|
LoadStoneAgeLUA(filename);
|
|
|
|
|
}else{
|
|
|
|
|
#ifdef _RELUA_
|
|
|
|
|
if( strcmptail( wfd.cFileName, ".lua" ) == 0)
|
|
|
|
|
#else
|
|
|
|
|
#ifdef _SA_VERSION_25
|
|
|
|
|
if( strcmptail( wfd.cFileName, "es" ) == 0)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
char filename[256];
|
|
|
|
|
memset(filename, 0, 256);
|
|
|
|
|
sprintf_s(filename, "%s//%s", path, wfd.cFileName);
|
|
|
|
|
myluaload(filename);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}while (FindNextFile(hFind, &wfd));
|
2020-06-23 15:53:23 +08:00
|
|
|
|
FindClose(hFind); // 关闭查找句柄
|
2020-06-23 15:27:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ReLoadStoneAgeLUA(char *filename)
|
|
|
|
|
{
|
|
|
|
|
remyluaload(filename);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NewLoadStoneAgeLUA(char *filename)
|
|
|
|
|
{
|
|
|
|
|
char token[256];
|
|
|
|
|
if(strlen(filename)>0){
|
|
|
|
|
sprintf_s(token, "%s//%s", _LUA_PATCH_,filename);
|
|
|
|
|
myluaload(token);
|
|
|
|
|
}else{
|
|
|
|
|
LoadStoneAgeLUA(_LUA_PATCH_);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lua_State *FindLua(char *filename)
|
|
|
|
|
{
|
|
|
|
|
MY_Lua *salua = &MYLua;
|
|
|
|
|
char newfilename[256];
|
|
|
|
|
sprintf_s(newfilename, "%s", filename);
|
|
|
|
|
while(salua->next != NULL){
|
|
|
|
|
if(strcmp(newfilename, salua->luapath) == 0){
|
|
|
|
|
return salua->lua;
|
|
|
|
|
}
|
|
|
|
|
salua = salua->next;
|
|
|
|
|
}
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int FreeGetBattleMap(int floor)
|
|
|
|
|
{
|
|
|
|
|
lua_State *lua = NULL;
|
|
|
|
|
if (lua == NULL){
|
|
|
|
|
char filename[256];
|
|
|
|
|
#ifdef _RELUA_
|
|
|
|
|
sprintf_s(filename, "%s//map//battlemap.lua",_LUA_PATCH_);
|
|
|
|
|
#else
|
|
|
|
|
#ifdef _SA_VERSION_25
|
|
|
|
|
sprintf_s(filename, "%s//map//battlemap.es",_LUA_PATCH_);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
lua = FindLua(filename);
|
|
|
|
|
if (lua == NULL)return NULL;
|
|
|
|
|
}
|
|
|
|
|
lua_getglobal(lua, "FreeGetBattleMap");
|
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
2020-06-23 15:53:23 +08:00
|
|
|
|
printf("FreeGetBattleMap 错误内容 (%s)\n", lua_tostring(lua, -1));
|
2020-06-23 15:27:59 +08:00
|
|
|
|
lua_pop(lua, 1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
lua_pushnumber(lua, floor);
|
|
|
|
|
int TM_Ret = lua_pcall(lua, 1, 1, 0);
|
|
|
|
|
|
|
|
|
|
if (TM_Ret != 0){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
printf("入口:FreeGetBattleMap 错误内容:%d(%s)\n", TM_Ret, lua_tostring(lua, -1));
|
2020-06-23 15:27:59 +08:00
|
|
|
|
lua_pop(lua, 1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
if (!lua_isnumber(lua, -1))
|
|
|
|
|
return NULL;
|
|
|
|
|
int ret = (int)lua_tonumber(lua, -1);
|
|
|
|
|
lua_pop(lua, 1);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _CHARTITLE_STR_
|
|
|
|
|
char* FreeGetTitleStr(int id)
|
|
|
|
|
{
|
|
|
|
|
lua_State *lua = NULL;
|
|
|
|
|
if (lua == NULL){
|
|
|
|
|
char filename[256];
|
|
|
|
|
#ifdef _RELUA_
|
|
|
|
|
sprintf_s(filename, "%s//title.lua",_LUA_PATCH_);
|
|
|
|
|
#else
|
|
|
|
|
#ifdef _SA_VERSION_25
|
|
|
|
|
sprintf_s(filename, "%s//title.es",_LUA_PATCH_);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
lua = FindLua(filename);
|
|
|
|
|
if (lua == NULL)return NULL;
|
|
|
|
|
}
|
|
|
|
|
lua_getglobal(lua, "GetTitleStr");
|
|
|
|
|
if (!lua_isfunction(lua, -1)) {
|
2020-06-23 15:53:23 +08:00
|
|
|
|
printf("GetTitleStr 错误内容 (%s)\n", lua_tostring(lua, -1));
|
2020-06-23 15:27:59 +08:00
|
|
|
|
lua_pop(lua, 1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
lua_pushnumber(lua, id);
|
|
|
|
|
int TM_Ret = lua_pcall(lua, 1, 1, 0);
|
|
|
|
|
|
|
|
|
|
if (TM_Ret != 0){
|
2020-06-23 15:53:23 +08:00
|
|
|
|
printf("入口:GetTitleStr 错误内容:%d(%s)\n", TM_Ret, lua_tostring(lua, -1));
|
2020-06-23 15:27:59 +08:00
|
|
|
|
lua_pop(lua, 1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
if (!lua_isstring(lua, -1))
|
|
|
|
|
return NULL;
|
|
|
|
|
char *ret = (char *)lua_tostring(lua, -1);
|
|
|
|
|
lua_pop(lua, 1);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|