mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-10 20:46:47 +03:00
Added Debug Console Window
Added Script function that handles standalone script commands
This commit is contained in:
parent
8ca2bf97a4
commit
ca12b10ec3
3 changed files with 79 additions and 12 deletions
|
@ -1033,7 +1033,7 @@ void GameScript::FreeLevelScripts()
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
string GameScript::loadScriptFromFile(char* luaFilename)
|
string GameScript::loadScriptFromFile(const char* luaFilename)
|
||||||
{
|
{
|
||||||
ifstream ifs(luaFilename, ios::in | ios::binary | ios::ate);
|
ifstream ifs(luaFilename, ios::in | ios::binary | ios::ate);
|
||||||
|
|
||||||
|
@ -1046,10 +1046,9 @@ string GameScript::loadScriptFromFile(char* luaFilename)
|
||||||
return string(bytes.data(), fileSize);
|
return string(bytes.data(), fileSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GameScript::ExecuteScript(char* luaFilename, string* message)
|
bool GameScript::ExecuteScript(const char* luaFilename, string* message)
|
||||||
{
|
{
|
||||||
sol::protected_function_result result;
|
sol::protected_function_result result;
|
||||||
|
|
||||||
result = m_lua->safe_script_file(luaFilename, sol::environment(m_lua->lua_state(), sol::create, m_lua->globals()), sol::script_pass_on_error);
|
result = m_lua->safe_script_file(luaFilename, sol::environment(m_lua->lua_state(), sol::create, m_lua->globals()), sol::script_pass_on_error);
|
||||||
if (!result.valid())
|
if (!result.valid())
|
||||||
{
|
{
|
||||||
|
@ -1061,6 +1060,20 @@ bool GameScript::ExecuteScript(char* luaFilename, string* message)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GameScript::ExecuteString(const char* command, string* message)
|
||||||
|
{
|
||||||
|
sol::protected_function_result result;
|
||||||
|
result = m_lua->safe_script(command);
|
||||||
|
if (!result.valid())
|
||||||
|
{
|
||||||
|
sol::error error = result;
|
||||||
|
*message = error.what();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
message->clear();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool GameScript::ExecuteTrigger(short index)
|
bool GameScript::ExecuteTrigger(short index)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -136,12 +136,13 @@ private:
|
||||||
map<string, short> m_itemsMapName;
|
map<string, short> m_itemsMapName;
|
||||||
vector<LuaFunction*> m_triggers;
|
vector<LuaFunction*> m_triggers;
|
||||||
|
|
||||||
string loadScriptFromFile(char* luaFilename);
|
string loadScriptFromFile(const char* luaFilename);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GameScript(sol::state* lua);
|
GameScript(sol::state* lua);
|
||||||
|
|
||||||
bool ExecuteScript(char* luaFilename, string* message);
|
bool ExecuteScript(const char* luaFilename, string* message);
|
||||||
|
bool ExecuteString(const char* command, string* message);
|
||||||
void FreeLevelScripts();
|
void FreeLevelScripts();
|
||||||
void AddTrigger(LuaFunction* function);
|
void AddTrigger(LuaFunction* function);
|
||||||
void AddLuaId(int luaId, short itemNumber);
|
void AddLuaId(int luaId, short itemNumber);
|
||||||
|
|
|
@ -19,7 +19,10 @@
|
||||||
#include "..\Specific\level.h"
|
#include "..\Specific\level.h"
|
||||||
|
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <io.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <windows.h>
|
||||||
WINAPP App;
|
WINAPP App;
|
||||||
unsigned int threadId;
|
unsigned int threadId;
|
||||||
uintptr_t hThread;
|
uintptr_t hThread;
|
||||||
|
@ -28,12 +31,13 @@ byte receivedWmClose = false;
|
||||||
bool Debug = false;
|
bool Debug = false;
|
||||||
HWND WindowsHandle;
|
HWND WindowsHandle;
|
||||||
int App_Unk00D9ABFD;
|
int App_Unk00D9ABFD;
|
||||||
|
extern string LuaMessage;
|
||||||
extern int IsLevelLoading;
|
extern int IsLevelLoading;
|
||||||
extern GameFlow* g_GameFlow;
|
extern GameFlow* g_GameFlow;
|
||||||
extern GameScript* g_GameScript;
|
extern GameScript* g_GameScript;
|
||||||
extern GameConfiguration g_Configuration;
|
extern GameConfiguration g_Configuration;
|
||||||
|
DWORD DebugConsoleThreadID;
|
||||||
|
DWORD MainThreadID;
|
||||||
int lua_exception_handler(lua_State *L, sol::optional<const exception&> maybe_exception, sol::string_view description)
|
int lua_exception_handler(lua_State *L, sol::optional<const exception&> maybe_exception, sol::string_view description)
|
||||||
{
|
{
|
||||||
return luaL_error(L, description.data());
|
return luaL_error(L, description.data());
|
||||||
|
@ -89,8 +93,32 @@ void __stdcall HandleWmCommand(unsigned short wParam)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HandleScriptMessage(WPARAM wParam)
|
||||||
|
{
|
||||||
|
string message = *(string*)(wParam);
|
||||||
|
const string luafileSuffix(".lua");
|
||||||
|
//check whether line starts with "lua "
|
||||||
|
if (message.rfind("lua ", 0) == 0) {
|
||||||
|
string scriptSubstring = message.substr(4);
|
||||||
|
//check whether the string ends with .lua, if yes execute from file, otherwise execute directly
|
||||||
|
if (scriptSubstring.rfind(luafileSuffix) == (scriptSubstring.size() - luafileSuffix.size())) {
|
||||||
|
g_GameScript->ExecuteScript(scriptSubstring.c_str(),&LuaMessage);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
g_GameScript->ExecuteString(scriptSubstring.c_str(), &LuaMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
LRESULT CALLBACK WinAppProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK WinAppProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
if (msg == WM_USER + 0) {
|
||||||
|
HandleScriptMessage(wParam);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
// Disables ALT + SPACE
|
// Disables ALT + SPACE
|
||||||
if (msg == WM_SYSCOMMAND && wParam == SC_KEYMENU) {
|
if (msg == WM_SYSCOMMAND && wParam == SC_KEYMENU) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -184,7 +212,6 @@ int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdL
|
||||||
if (wcscmp(argv[i], L"/debug") == 0)
|
if (wcscmp(argv[i], L"/debug") == 0)
|
||||||
Debug = true;
|
Debug = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalFree(argv);
|
LocalFree(argv);
|
||||||
|
|
||||||
// Clear Application Structure
|
// Clear Application Structure
|
||||||
|
@ -280,7 +307,6 @@ int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdL
|
||||||
}
|
}
|
||||||
|
|
||||||
WindowsHandle = App.WindowHandle;
|
WindowsHandle = App.WindowHandle;
|
||||||
|
|
||||||
// Initialise the renderer
|
// Initialise the renderer
|
||||||
g_Renderer->Initialise(g_Configuration.Width, g_Configuration.Height, g_Configuration.RefreshRate,
|
g_Renderer->Initialise(g_Configuration.Width, g_Configuration.Height, g_Configuration.RefreshRate,
|
||||||
g_Configuration.Windowed, App.WindowHandle);
|
g_Configuration.Windowed, App.WindowHandle);
|
||||||
|
@ -298,7 +324,34 @@ int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdL
|
||||||
|
|
||||||
UpdateWindow(WindowsHandle);
|
UpdateWindow(WindowsHandle);
|
||||||
ShowWindow(WindowsHandle, nShowCmd);
|
ShowWindow(WindowsHandle, nShowCmd);
|
||||||
|
//Create debug script terminal
|
||||||
|
if (Debug) {
|
||||||
|
MainThreadID = GetWindowThreadProcessId(WindowsHandle, NULL);
|
||||||
|
AllocConsole();
|
||||||
|
HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
|
DWORD consoleModeIn;
|
||||||
|
int hCrt = _open_osfhandle((long)handle_in, _O_BINARY);
|
||||||
|
FILE* hf_in = _fdopen(hCrt, "r");
|
||||||
|
setvbuf(hf_in, NULL, _IONBF, 512);
|
||||||
|
*stdin = *hf_in;
|
||||||
|
GetConsoleMode(handle_in, &consoleModeIn);
|
||||||
|
consoleModeIn = consoleModeIn | ENABLE_LINE_INPUT;
|
||||||
|
SetConsoleMode(handle_in, consoleModeIn);
|
||||||
|
LPTHREAD_START_ROUTINE readConsoleLoop = [](LPVOID params) -> DWORD {
|
||||||
|
DWORD read;
|
||||||
|
CHAR buffer[4096];
|
||||||
|
while (true) {
|
||||||
|
BOOL success = ReadFile(params, &buffer, 4096, &read, NULL);
|
||||||
|
if (success) {
|
||||||
|
//Only send the actual written message minus \r\n
|
||||||
|
string msg(buffer, read-2);
|
||||||
|
SendMessageA(WindowsHandle, WM_USER + 0, (WPARAM)&msg, NULL);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
CreateThread(NULL, 0, readConsoleLoop, handle_in, 0, &DebugConsoleThreadID);
|
||||||
|
}
|
||||||
SetCursor(0);
|
SetCursor(0);
|
||||||
ShowCursor(0);
|
ShowCursor(0);
|
||||||
hAccTable = LoadAcceleratorsA(hInstance, (LPCSTR)0x65);
|
hAccTable = LoadAcceleratorsA(hInstance, (LPCSTR)0x65);
|
||||||
|
@ -337,4 +390,4 @@ int WinClose()
|
||||||
SaveGame::End();
|
SaveGame::End();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue