embed event api compatibility lua script

probably temporary, can't deprecate and remove an extremely common api in the same version.
lua script embed code mostly copied from my mod
This commit is contained in:
jacob1 2018-11-17 00:09:48 -05:00
parent e48bd482f6
commit 2929264885
11 changed files with 284 additions and 3 deletions

View File

@ -180,7 +180,7 @@ if GetOption("msvc"):
env.Append(LIBPATH=['StaticLibs/'])
else:
env.Append(LIBPATH=['Libraries/'])
env.Append(CPPPATH=['includes/'])
env.Append(CPPPATH=['includes/', 'resources/'])
#Check 32/64 bit
def CheckBit(context):

View File

@ -1,4 +1,5 @@
#define IDI_ICON1 101
#define IDI_ICON2 102
#include "resource.h"
IDI_ICON1 ICON DISCARDABLE "powder.ico"
IDI_ICON2 ICON DISCARDABLE "document.ico"
IDI_EVENTCOMPAT LUASCRIPT "../src/lua/luascripts/eventcompat.lua"

7
resources/resource.h Normal file
View File

@ -0,0 +1,7 @@
#define LUASCRIPT 256
#define IDI_ICON1 101
#define IDI_ICON2 102
#define IDI_TPTMP 103
#define IDI_SCRIPTMANAGER 104
#define IDI_EVENTCOMPAT 105

View File

@ -132,4 +132,16 @@ long unsigned int GetTime()
#endif
}
void LoadFileInResource(int name, int type, unsigned int& size, const char*& data)
{
#ifdef _MSC_VER
HMODULE handle = ::GetModuleHandle(NULL);
HRSRC rc = ::FindResource(handle, MAKEINTRESOURCE(name), MAKEINTRESOURCE(type));
HGLOBAL rcData = ::LoadResource(handle, rc);
size = ::SizeofResource(handle, rc);
data = static_cast<const char*>(::LockResource(rcData));
#endif
}
}

View File

@ -12,6 +12,8 @@ namespace Platform
void Millisleep(long int t);
long unsigned int GetTime();
void LoadFileInResource(int name, int type, unsigned int& size, const char*& data);
}
#endif

View File

@ -19,6 +19,7 @@ extern int tptPropertiesVersion;
extern int tptElements; //Table for TPT element names
extern int tptParts, tptPartsMeta, tptElementTransitions, tptPartsCData, tptPartMeta, tptPart, cIndex;
void luaopen_eventcompat(lua_State *l);
void luacon_hook(lua_State *L, lua_Debug *ar);
int luacon_eval(const char *command);
String luacon_geterror();

View File

@ -335,6 +335,9 @@ tpt.partsdata = nil");
lua_setmetatable(l, -2);
initLegacyProps();
ui::Engine::Ref().LastTick(Platform::GetTime());
luaopen_eventcompat(l);
}
void LuaScriptInterface::Init()

View File

@ -0,0 +1,174 @@
if not event then
return
end
local deprecated_scripts = {}
local timer = nil
local function print_deprecation_warnings()
if not timer or timer <= 0 then
event.unregister(event.tick, print_deprecation_warnings)
else
timer = timer - 1
return
end
local deprecated = {}
for k,v in pairs(deprecated_scripts) do
table.insert(deprecated, k)
end
local start_message = #deprecated == 1 and "This script is" or "These scripts are"
print(start_message.." using a legacy event api and should be updated: ")
print("\""..table.concat(deprecated, "\", \"").."\"")
end
local function deprecationwarning()
-- no warning for now
--[[local calling_file_info = debug.getinfo(3, "S")
if calling_file_info then
calling_file_info = calling_file_info["short_src"]
if calling_file_info then
deprecated_scripts[calling_file_info] = true
if not timer then
timer = 5
event.register(event.tick, print_deprecation_warnings)
end
end
end]]
end
function tpt.register_step(f)
deprecationwarning()
event.register(event.tick, f)
end
function tpt.unregister_step(f)
deprecationwarning()
event.unregister(event.tick, f)
end
local registered_mouseclicks = {}
function tpt.register_mouseclick(f)
deprecationwarning()
local mousex = -1
local mousey = -1
local mousedown = -1
local function mousedownfunc(x, y, button)
--replicate hack in original function
if button == 3 then
button = 4
end
mousex = x
mousey = y
mousedown = button
return f(x, y, button, 1, 0)
end
local function mouseupfunc(x, y, button, evt)
--ignore automatic mouseup event sent when switching windows
if mousedown == -1 and evt == 1 then
return
end
--replicate hack in original function
if button == 3 then
button = 4
end
local evtType = 2
if evt == 1 then
evtType = 4
elseif evt == 2 then
evtType = 5
end
--zoom window cancel
--Original function would have started returning 0 for mousetick events
--(until the actual mousedown), but we don't replicate that here
if evt ~= 2 then
mousedown = -1
end
return f(x, y, button, evtType, 0)
end
local function mousemovefunc(x, y, dx, dy)
mousex = x
mousey = y
end
local function mousewheelfunc(x, y, d)
return f(x, y, 0, 0, d)
end
local function tickfunc()
if mousedown ~= -1 then
return f(mousex, mousey, mousedown, 3, 0)
end
end
event.register(event.mousedown, mousedownfunc)
event.register(event.mouseup, mouseupfunc)
event.register(event.mousemove, mousemovefunc)
event.register(event.mousewheel, mousewheelfunc)
event.register(event.tick, tickfunc)
local funcs = {mousedownfunc, mouseupfunc, mousemovefunc, mousewheelfunc, tickfunc}
registered_mouseclicks[f] = funcs
end
tpt.register_mouseevent = tpt.register_mouseclick
function tpt.unregister_mouseclick(f)
if not registered_mouseclicks[f] then return end
local funcs = registered_mouseclicks[f]
event.unregister(event.mousedown, funcs[1])
event.unregister(event.mouseup, funcs[2])
event.unregister(event.mousemove, funcs[3])
event.unregister(event.mousewheel, funcs[4])
event.unregister(event.tick, funcs[5])
end
tpt.unregister_mouseevent = tpt.unregister_mouseclick
function tpt.register_keypress(f)
deprecationwarning()
local keyMapping = {}
-- lctrl, rctlr, lshift, rshift, lalt, ralt
keyMapping[225] = 304
keyMapping[229] = 303
keyMapping[224] = 306
keyMapping[228] = 305
keyMapping[226] = 308
keyMapping[230] = 307
--up, down, right, left
keyMapping[82] = 273
keyMapping[81] = 274
keyMapping[79] = 275
keyMapping[80] = 276
event.register(event.keypress, function(key, scan, rep, shift, ctrl, alt)
if rep then return end
local mod = event.getmodifiers()
-- attempt to convert to string representation
err, keyStr = pcall(string.char, key)
if not err then keyStr = "" end
if keyStr ~= "" and shift then keyStr = string.upper(keyStr) end
-- key mapping for common keys, extremely incomplete
if keyMapping[scan] then key = keyMapping[scan] end
return f(keyStr, key, mod, 1)
end)
event.register(event.keyrelease, function(key, scan, rep, shift, ctrl, alt)
local mod = event.getmodifiers()
-- attempt to convert to string representation
err, keyStr = pcall(string.char, key)
if not err then keyStr = "" end
-- key mapping for common keys, extremely incomplete
if keyMapping[scan] then key = keyMapping[scan] end
return f(keyStr, key, mod, 2)
end)
end
tpt.register_keyevent = tpt.register_keypress

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,27 @@
#ifdef LUACONSOLE
#ifdef _MSC_VER
#include "Platform.h"
#include "resource.h"
#endif
#include "lua/LuaCompat.h"
void luaopen_eventcompat(lua_State *l)
{
#ifndef _MSC_VER
int eventcompat_luac_sz = /*#SIZE*/;
const char* eventcompat_luac = /*#DATA*/;
luaL_loadbuffer(l, eventcompat_luac, eventcompat_luac_sz, "@eventcompat.lua");
lua_pcall(l, 0, 0, 0);
#else
unsigned int size = 0;
const char* data = NULL;
Platform::LoadFileInResource(IDI_EVENTCOMPAT, LUASCRIPT, size, data);
char *buffer = new char[size+1];
::memcpy(buffer, data, size);
buffer[size] = 0;
luaL_loadbuffer(l, buffer, size, "@eventcompat.lua");
lua_pcall(l, 0, 0, 0);
delete[] buffer;
#endif
}
#endif

View File

@ -0,0 +1,27 @@
#file from mniip, https://github.com/mniip/The-Powder-Toy/commit/d46d9f3f815d
import sys
import re
def encode(x):
x = x.group(0)
if x == '\n':
return '\\n';
if x == '"':
return '\\"';
if x == '\\':
return '\\\\';
return '\\{0:03o}'.format(ord(x))
f = open(sys.argv[2], 'rb')
data = f.read().decode('utf-8')
f.close()
size = len(data)
data = '"' + re.sub(r'[^ -~]|"|\\', encode, data) + '"';
i = open(sys.argv[3], 'r')
o = open(sys.argv[1], 'w')
o.write(i.read().replace('/*#SIZE*/', str(size)).replace('/*#DATA*/', data))
i.close()
o.close()