diff --git a/src/cat/LegacyLuaAPI.cpp b/src/cat/LegacyLuaAPI.cpp index e2dba355a..b9afd7e0f 100644 --- a/src/cat/LegacyLuaAPI.cpp +++ b/src/cat/LegacyLuaAPI.cpp @@ -1854,7 +1854,12 @@ int luatpt_active_menu(lua_State* l) int luatpt_decorations_enable(lua_State* l) { int decostate; - decostate = luaL_optint(l, 1, 0); + decostate = luaL_optint(l, 1, -1); + if (decostate == -1) + { + lua_pushinteger(l, luacon_model->GetDecoration()); + return 1; + } luacon_model->SetDecoration(decostate==0?false:true); luacon_model->UpdateQuickOptions(); return 0; @@ -1863,14 +1868,19 @@ int luatpt_decorations_enable(lua_State* l) int luatpt_heat(lua_State* l) { int heatstate; - heatstate = luaL_optint(l, 1, 0); + heatstate = luaL_optint(l, 1, -1); + if (heatstate == -1) + { + lua_pushinteger(l, luacon_sim->legacy_enable); + return 1; + } luacon_sim->legacy_enable = (heatstate==1?0:1); return 0; } int luatpt_cmode_set(lua_State* l) { - int cmode = luaL_optint(l, 1, 0)+1; + int cmode = luaL_optint(l, 1, 3)+1; if (cmode == 11) cmode = 0; if (cmode >= 0 && cmode <= 10) @@ -1893,8 +1903,13 @@ int luatpt_setdebug(lua_State* l) } int luatpt_setfpscap(lua_State* l) { - int fpscap = luaL_optint(l, 1, 0); - if (fpscap < 2) + int fpscap = luaL_optint(l, 1, -1); + if (fpscap == -1) + { + lua_pushinteger(l, ui::Engine::Ref().FpsLimit); + return 1; + } + else if (fpscap < 2) return luaL_error(l, "fps cap too small"); ui::Engine::Ref().FpsLimit = fpscap; return 0; diff --git a/src/cat/LuaScriptInterface.cpp b/src/cat/LuaScriptInterface.cpp index da03be505..1a600efe1 100644 --- a/src/cat/LuaScriptInterface.cpp +++ b/src/cat/LuaScriptInterface.cpp @@ -456,6 +456,8 @@ void LuaScriptInterface::initSimulationAPI() {"createWallBox", simulation_createWallBox}, {"floodWalls", simulation_floodWalls}, {"clearSim", simulation_clearSim}, + {"saveStamp", simulation_saveStamp}, + {"loadStamp", simulation_loadStamp}, {NULL, NULL} }; luaL_register(l, "simulation", simulationAPIMethods); @@ -1094,6 +1096,47 @@ int LuaScriptInterface::simulation_clearSim(lua_State * l) return 0; } +int LuaScriptInterface::simulation_saveStamp(lua_State * l) +{ + int x = luaL_optint(l,1,0); + int y = luaL_optint(l,2,0); + int w = luaL_optint(l,3,XRES); + int h = luaL_optint(l,4,YRES); + std::string name = luacon_controller->StampRegion(ui::Point(x, y), ui::Point(x+w, y+h)); + lua_pushstring(l, name.c_str()); + return 1; +} + +int LuaScriptInterface::simulation_loadStamp(lua_State * l) +{ + int stamp_size, i = -1, j, x, y, ret; + SaveFile * tempfile; + x = luaL_optint(l,2,0); + y = luaL_optint(l,3,0); + if (lua_isnumber(l, 1)) //Load from stamp ID + { + i = luaL_optint(l, 1, 0); + int stampCount = Client::Ref().GetStampsCount(); + if (i < 0 || i >= stampCount) + return luaL_error(l, "Invalid stamp ID: %d", i); + tempfile = Client::Ref().GetStamp(Client::Ref().GetStamps(0, stampCount)[i]); + } + else //Load from 10 char name, or full filename + { + char * filename = (char*)luaL_optstring(l, 1, ""); + tempfile = Client::Ref().GetStamp(filename); + } + if (tempfile) + { + luacon_sim->Load(x, y, tempfile->GetGameSave()); + //luacon_sim->sys_pause = (tempfile->GetGameSave()->paused | luacon_model->GetPaused())?1:0; + lua_pushinteger(l, 1); + } + else + lua_pushnil(l); + return 1; +} + //// Begin Renderer API diff --git a/src/cat/LuaScriptInterface.h b/src/cat/LuaScriptInterface.h index 9b5468852..c002f4188 100644 --- a/src/cat/LuaScriptInterface.h +++ b/src/cat/LuaScriptInterface.h @@ -73,6 +73,8 @@ class LuaScriptInterface: public CommandInterface static int simulation_createWallBox(lua_State * l); static int simulation_floodWalls(lua_State * l); static int simulation_clearSim(lua_State * l); + static int simulation_saveStamp(lua_State * l); + static int simulation_loadStamp(lua_State * l); //Renderer void initRendererAPI(); diff --git a/src/client/Client.cpp b/src/client/Client.cpp index 1a2f296ff..367aa70dd 100644 --- a/src/client/Client.cpp +++ b/src/client/Client.cpp @@ -949,6 +949,8 @@ void Client::MoveStampToFront(std::string stampID) SaveFile * Client::GetStamp(std::string stampID) { std::string stampFile = std::string(STAMPS_DIR PATH_SEP + stampID + ".stm"); + if (!FileExists(stampFile)) + stampFile = stampID; if(FileExists(stampFile)) { SaveFile * file = new SaveFile(stampID); diff --git a/src/gui/game/GameController.cpp b/src/gui/game/GameController.cpp index ad48f6615..267133b9f 100644 --- a/src/gui/game/GameController.cpp +++ b/src/gui/game/GameController.cpp @@ -509,17 +509,20 @@ void GameController::ToolClick(int toolSelection, ui::Point point) activeTool->Click(sim, cBrush, point); } -void GameController::StampRegion(ui::Point point1, ui::Point point2) +std::string GameController::StampRegion(ui::Point point1, ui::Point point2) { GameSave * newSave; newSave = gameModel->GetSimulation()->Save(point1.X, point1.Y, point2.X, point2.Y); if(newSave) { newSave->paused = gameModel->GetPaused(); - gameModel->AddStamp(newSave); + return gameModel->AddStamp(newSave); } else + { new ErrorMessage("Could not create stamp", "Error generating save file"); + return ""; + } } void GameController::CopyRegion(ui::Point point1, ui::Point point2) diff --git a/src/gui/game/GameController.h b/src/gui/game/GameController.h index 59fd4c8f1..b67df411b 100644 --- a/src/gui/game/GameController.h +++ b/src/gui/game/GameController.h @@ -90,7 +90,7 @@ public: void DrawRect(int toolSelection, ui::Point point1, ui::Point point2); void DrawLine(int toolSelection, ui::Point point1, ui::Point point2); void DrawFill(int toolSelection, ui::Point point); - void StampRegion(ui::Point point1, ui::Point point2); + std::string StampRegion(ui::Point point1, ui::Point point2); void CopyRegion(ui::Point point1, ui::Point point2); void CutRegion(ui::Point point1, ui::Point point2); void Update(); diff --git a/src/gui/game/GameModel.cpp b/src/gui/game/GameModel.cpp index 960f45a07..aecd0eb0c 100644 --- a/src/gui/game/GameModel.cpp +++ b/src/gui/game/GameModel.cpp @@ -348,10 +348,8 @@ void GameModel::BuildMenus() //Set default menu activeMenu = SC_POWDERS; - if(lastMenu != -1) //What is this? ... - { + if(lastMenu != -1) activeMenu = lastMenu; - } if(activeMenu != -1) toolList = menuList[activeMenu]->GetToolList(); @@ -882,12 +880,12 @@ void GameModel::SetPlaceSave(GameSave * save) notifyPlaceSaveChanged(); } -void GameModel::AddStamp(GameSave * save) +std::string GameModel::AddStamp(GameSave * save) { if(stamp) delete stamp; stamp = save; - Client::Ref().AddStamp(save); + return Client::Ref().AddStamp(save); } void GameModel::SetClipboard(GameSave * save) diff --git a/src/gui/game/GameModel.h b/src/gui/game/GameModel.h index dd54d9168..92df87f51 100644 --- a/src/gui/game/GameModel.h +++ b/src/gui/game/GameModel.h @@ -186,7 +186,7 @@ public: void SetZoomWindowPosition(ui::Point position); ui::Point GetZoomWindowPosition(); void SetStamp(GameSave * newStamp); - void AddStamp(GameSave * save); + std::string AddStamp(GameSave * save); void SetClipboard(GameSave * save); void SetPlaceSave(GameSave * save); void Log(string message);