diff --git a/src/cat/LuaScriptInterface.cpp b/src/cat/LuaScriptInterface.cpp index ff282ff3b..19c9ac82d 100644 --- a/src/cat/LuaScriptInterface.cpp +++ b/src/cat/LuaScriptInterface.cpp @@ -20,11 +20,14 @@ #include "dialogues/TextPrompt.h" #include "dialogues/ConfirmPrompt.h" #include "simulation/Simulation.h" -#include "virtualmachine/VirtualMachine.h" #include "game/GameModel.h" #include "LuaScriptHelper.h" #include "client/HTTP.h" +//#include "virtualmachine/VirtualMachine.h" +#include "pim/Parser.h" +#include "pim/Machine.h" + #include "LuaBit.h" #include "LuaWindow.h" @@ -665,17 +668,24 @@ void LuaScriptInterface::initElementsAPI() } } -vm::VirtualMachine * LuaScriptInterface::updateVirtualMachines[PT_NUM]; +pim::VirtualMachine * LuaScriptInterface::updateVirtualMachines[PT_NUM]; int LuaScriptInterface::updateVM(UPDATE_FUNC_ARGS) { - vm::VirtualMachine * vMachine = updateVirtualMachines[parts[i].type]; + pim::VirtualMachine * machine = updateVirtualMachines[parts[i].type]; + + machine->CSPush(i); + machine->CSPush(x); + machine->CSPush(y); + machine->Call(0); + + + /*vm::VirtualMachine * vMachine = updateVirtualMachines[parts[i].type]; vm::word w; int argAddr = 0, argCount = 5; vMachine->sim = sim; - /* Set up call. */ vMachine->OpPUSH(w); //Pointless null in stack w.int4 = (argCount + 2) * sizeof(vm::word); vMachine->OpENTER(w); @@ -696,7 +706,7 @@ int LuaScriptInterface::updateVM(UPDATE_FUNC_ARGS) w.int4 = (argCount + 2) * sizeof(vm::word); vMachine->OpLEAVE(w); vMachine->OpPOP(w); //Pop pointless null - vMachine->End(); + vMachine->End();*/ return 0; } @@ -1017,7 +1027,7 @@ int LuaScriptInterface::elements_property(lua_State * l) } else if(lua_type(l, 3) == LUA_TLIGHTUSERDATA) { - updateVirtualMachines[id] = (vm::VirtualMachine*)lua_touserdata(l, 3); + updateVirtualMachines[id] = (pim::VirtualMachine*)lua_touserdata(l, 3); luacon_sim->elements[id].Update = &updateVM; } else if(lua_type(l, 3) == LUA_TBOOLEAN && !lua_toboolean(l, 3)) @@ -1142,7 +1152,7 @@ void LuaScriptInterface::initVirtualMachineAPI() int LuaScriptInterface::virtualMachine_loadProgram(lua_State * l) { - luaL_checktype(l, 1, LUA_TSTRING); + /*luaL_checktype(l, 1, LUA_TSTRING); vm::VirtualMachine * newVM = new vm::VirtualMachine(1); try @@ -1156,7 +1166,19 @@ int LuaScriptInterface::virtualMachine_loadProgram(lua_State * l) { return luaL_error(l, "Unable to load program"); } - lua_pushlightuserdata(l, newVM); + lua_pushlightuserdata(l, newVM);*/ + std::string programSource(lua_tostring(l, 1)); + std::stringstream input(programSource); + + + pim::compiler::Parser * parser = new pim::compiler::Parser(input); + + std::vector programData = parser->Compile(); + + pim::VirtualMachine * machine = new pim::VirtualMachine(luacon_sim); + machine->LoadProgram(programData); + + lua_pushlightuserdata(l, machine); return 1; } diff --git a/src/cat/LuaScriptInterface.h b/src/cat/LuaScriptInterface.h index c40728c8e..975815709 100644 --- a/src/cat/LuaScriptInterface.h +++ b/src/cat/LuaScriptInterface.h @@ -23,7 +23,7 @@ namespace ui class Window; } -namespace vm +namespace pim { class VirtualMachine; } @@ -65,7 +65,7 @@ class LuaScriptInterface: public CommandInterface { static int renderer_colourMode(lua_State * l); //Elements - static vm::VirtualMachine * updateVirtualMachines[PT_NUM]; + static pim::VirtualMachine * updateVirtualMachines[PT_NUM]; static int updateVM(UPDATE_FUNC_ARGS); // void initElementsAPI(); diff --git a/src/dialogues/LegacyDialogues.h b/src/dialogues/LegacyDialogues.h new file mode 100644 index 000000000..7f6097d25 --- /dev/null +++ b/src/dialogues/LegacyDialogues.h @@ -0,0 +1,11 @@ +#pragma once + +//Legacy blocking prompts +//This are not implemented here, but rather in the engine bootstrapper +bool ConfirmUI(std::string title, std::string message, std::string confirmText) {} + +void ErrorUI(std::string title, std::string message) {} + +void InformationUI(std::string title, std::string message) {} + +std::string MessagePromptUI(std::string title, std::string message, std::string text, std::string placeholder) {} \ No newline at end of file diff --git a/src/interface/LuaProgressBar.h b/src/interface/LuaProgressBar.h new file mode 100644 index 000000000..dc2ef4e01 --- /dev/null +++ b/src/interface/LuaProgressBar.h @@ -0,0 +1,30 @@ +#pragma once + +extern "C" { + #include "lua.h" + #include "lauxlib.h" + #include "lualib.h" +} + +#include "LuaLuna.h" +#include "LuaComponent.h" + +namespace ui +{ + class ProgressBar; +} + +class LuaScriptInterface; + +class LuaProgressBar: public LuaComponent +{ + ui::ProgressBar * progressBar; + int onValueChangedFunction; + int value(lua_State * l); +public: + static const char className[]; + static Luna::RegType methods[]; + + LuaProgressBar(lua_State * l); + ~LuaProgressBar(); +}; \ No newline at end of file diff --git a/src/pim/Generator.cpp b/src/pim/Generator.cpp new file mode 100644 index 000000000..b2ea84cb2 --- /dev/null +++ b/src/pim/Generator.cpp @@ -0,0 +1,326 @@ +//Code generator for bytecode +#include +#include "Format.h" +#include "Generator.h" +#include "Opcodes.h" +namespace pim +{ + namespace compiler + { + Generator::Generator() : + output(std::cout), + labelCounter(0), + programCounter(0) + { + + } + + void Generator::defineLabel(std::string label) + { + Label newLabel; + newLabel.Name = label; + newLabel.Position = programCounter;//program.size(); + labelPositions.push_back(newLabel); + } + + void Generator::writeOpcode(int opcode) + { + programCounter++; + program.push_back(opcode); + } + + void Generator::writeConstant(std::string constant) + { + writeConstant(format::StringToNumber(constant)); + } + + void Generator::writeConstant(int constant) + { + program.push_back(constant & 0xFF); + program.push_back((constant>>8) & 0xFF); + program.push_back((constant>>16) & 0xFF); + program.push_back((constant>>24) & 0xFF); + } + + void Generator::writeConstantPlaceholder(std::string label) + { + placeholders.push_back(Placeholder(program.size(), label)); + program.push_back(0); + program.push_back(0); + program.push_back(0); + program.push_back(0); + } + + void Generator::writeConstantPlaceholder(int * value) + { + valuePlaceholders.push_back(ValuePlaceholder(program.size(), value)); + program.push_back(0); + program.push_back(0); + program.push_back(0); + program.push_back(0); + } + + std::vector Generator::Finish() + { + for(std::vector::iterator iter = placeholders.begin(), end = placeholders.end(); iter != end; ++iter) + { + bool found = false; + Placeholder cPosition = *iter; + for(std::vector