diff --git a/README.md b/README.md
index 9e5e7e7c4..b1e3205b9 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,13 @@
-Luanti is a free open-source voxel game engine with easy modding and game creation.
+Erbium is a free and open-source fork of Luanti.
Copyright (C) 2010-2025 Perttu Ahola
and contributors (see source file comments and the version control log)
diff --git a/builtin/mainmenu/game_theme.lua b/builtin/mainmenu/game_theme.lua
index b9e7e1d4b..a2136a2cf 100644
--- a/builtin/mainmenu/game_theme.lua
+++ b/builtin/mainmenu/game_theme.lua
@@ -29,7 +29,14 @@ function mm_game_theme.set_engine(hide_decorations)
mm_game_theme.clear_single("header")
mm_game_theme.clear_single("footer")
- core.set_clouds(false)
+
+ if core.settings:get_bool("menu_dark_theme") then
+ core.set_clouds_color("#1c2a47")
+ core.set_sky_color("#090b1a")
+ else
+ core.set_clouds_color("#f0f0ff")
+ core.set_sky_color("#8cbafa")
+ end
if not hide_decorations then
mm_game_theme.set_engine_single("header")
@@ -37,11 +44,7 @@ function mm_game_theme.set_engine(hide_decorations)
end
if not have_bg then
- if core.settings:get_bool("menu_clouds") then
- core.set_clouds(true)
- else
- mm_game_theme.set_dirt_bg()
- end
+ core.set_clouds(core.settings:get_bool("menu_clouds"))
end
end
@@ -71,12 +74,16 @@ function mm_game_theme.set_game(gamedetails)
mm_game_theme.set_game_single("header", gamedetails)
mm_game_theme.set_game_single("footer", gamedetails)
+ if core.settings:get_bool("menu_dark_theme") then
+ core.set_clouds_color("#1c2a47")
+ core.set_sky_color("#090b1a")
+ else
+ core.set_clouds_color("#f0f0ff")
+ core.set_sky_color("#8cbafa")
+ end
+
if not have_bg then
- if core.settings:get_bool("menu_clouds") then
- core.set_clouds(true)
- else
- mm_game_theme.set_dirt_bg()
- end
+ core.set_clouds(core.settings:get_bool("menu_clouds"))
end
end
@@ -156,20 +163,6 @@ function mm_game_theme.set_game_single(identifier, gamedetails)
return false
end
---------------------------------------------------------------------------------
-function mm_game_theme.set_dirt_bg()
- if mm_game_theme.texturepack ~= nil then
- local path = mm_game_theme.texturepack .. DIR_DELIM .. "default_dirt.png"
- if core.set_background("background", path, true, 128) then
- return true
- end
- end
-
- -- Use universal fallback texture in textures/base/pack
- local minimalpath = defaulttexturedir .. "menu_bg.png"
- core.set_background("background", minimalpath, true, 128)
-end
-
--------------------------------------------------------------------------------
function mm_game_theme.stop_music()
if mm_game_theme.music_handle ~= nil then
diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt
index 001ef42e0..25d9d2f25 100644
--- a/builtin/settingtypes.txt
+++ b/builtin/settingtypes.txt
@@ -148,7 +148,7 @@ toggle_aux1_key (Toggle Aux1 key) bool false
# the place button.
#
# Requires: keyboard_mouse
-repeat_place_time (Place repetition interval) float 0.25 0.16 2.0
+repeat_place_time (Place repetition interval) float 0.25 0.001 2.0
# The minimum time in seconds it takes between digging nodes when holding
# the dig button.
@@ -885,6 +885,9 @@ tooltip_append_itemname (Append item name) bool false
# Use a cloud animation for the main menu background.
menu_clouds (Clouds in menu) bool true
+# Use dark theme for the main menu background
+menu_dark_theme (Menu dark theme) bool true
+
[**HUD]
# Modifies the size of the HUD elements.
diff --git a/src/client/clientlauncher.cpp b/src/client/clientlauncher.cpp
index e01341be8..d0a8198ae 100644
--- a/src/client/clientlauncher.cpp
+++ b/src/client/clientlauncher.cpp
@@ -127,7 +127,7 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args)
g_menucloudsmgr = m_rendering_engine->get_scene_manager()->createNewSceneManager();
g_menuclouds = new Clouds(g_menucloudsmgr, ssrc.get(), -1, rand());
g_menuclouds->setHeight(100.0f);
- g_menuclouds->update(v3f(0, 0, 0), video::SColor(255, 240, 240, 255));
+ g_menuclouds->update(v3f(0, 0, 0), m_rendering_engine->getMenuCloudsColor());
scene::ICameraSceneNode* camera;
camera = g_menucloudsmgr->addCameraSceneNode(NULL, v3f(0, 0, 0), v3f(0, 60, 100));
camera->setFarValue(10000);
diff --git a/src/client/game.cpp b/src/client/game.cpp
index 210b17a27..0ca5ed5fd 100644
--- a/src/client/game.cpp
+++ b/src/client/game.cpp
@@ -3697,7 +3697,7 @@ void Game::readSettings()
m_cache_enable_fog = g_settings->getBool("enable_fog");
m_cache_mouse_sensitivity = g_settings->getFloat("mouse_sensitivity", 0.001f, 10.0f);
m_cache_joystick_frustum_sensitivity = std::max(g_settings->getFloat("joystick_frustum_sensitivity"), 0.001f);
- m_repeat_place_time = g_settings->getFloat("repeat_place_time", 0.16f, 2.0f);
+ m_repeat_place_time = g_settings->getFloat("repeat_place_time", 0.001f, 2.0f);
m_repeat_dig_time = g_settings->getFloat("repeat_dig_time", 0.0f, 2.0f);
m_cache_enable_noclip = g_settings->getBool("noclip");
diff --git a/src/client/renderingengine.cpp b/src/client/renderingengine.cpp
index dac81c7ca..f44bf684c 100644
--- a/src/client/renderingengine.cpp
+++ b/src/client/renderingengine.cpp
@@ -26,7 +26,6 @@
#include "irr_ptr.h"
RenderingEngine *RenderingEngine::s_singleton = nullptr;
-const video::SColor RenderingEngine::MENU_SKY_COLOR = video::SColor(255, 140, 186, 250);
/* Helper classes */
@@ -310,8 +309,9 @@ void RenderingEngine::draw_load_screen(const std::wstring &text,
auto *driver = get_video_driver();
- driver->setFog(RenderingEngine::MENU_SKY_COLOR);
- driver->beginScene(true, true, RenderingEngine::MENU_SKY_COLOR);
+ driver->setFog(getMenuSkyColor());
+ driver->beginScene(true, true, getMenuSkyColor());
+
if (g_settings->getBool("menu_clouds")) {
g_menuclouds->step(dtime * 3);
g_menucloudsmgr->drawAll();
@@ -402,6 +402,29 @@ void RenderingEngine::finalize()
core.reset();
}
+void RenderingEngine::setMenuSkyColor(video::SColor& color)
+{
+ m_menu_sky_color = video::SColor(color);
+}
+
+void RenderingEngine::setMenuCloudsColor(video::SColor& color)
+{
+ m_menu_clouds_color = video::SColor(color);
+}
+
+
+const video::SColor RenderingEngine::getMenuSkyColor()
+{
+ return m_menu_sky_color;
+}
+
+const video::SColor RenderingEngine::getMenuCloudsColor()
+{
+ return m_menu_clouds_color;
+}
+
+
+
void RenderingEngine::draw_scene(video::SColor skycolor, bool show_hud,
bool draw_wield_tool, bool draw_crosshair)
{
diff --git a/src/client/renderingengine.h b/src/client/renderingengine.h
index f71f16e95..64317103e 100644
--- a/src/client/renderingengine.h
+++ b/src/client/renderingengine.h
@@ -63,8 +63,6 @@ class FogShaderUniformSetterFactory : public IShaderUniformSetterFactory
class RenderingEngine
{
public:
- static const video::SColor MENU_SKY_COLOR;
-
RenderingEngine(MyEventReceiver *eventReceiver);
~RenderingEngine();
@@ -136,6 +134,12 @@ class RenderingEngine
{
return m_device->run();
}
+
+ void setMenuSkyColor(video::SColor &color);
+ void setMenuCloudsColor(video::SColor &color);
+ const video::SColor getMenuSkyColor();
+ const video::SColor getMenuCloudsColor();
+
// FIXME: this is still global when it shouldn't be
static ShadowRenderer *get_shadow_renderer()
@@ -157,6 +161,8 @@ class RenderingEngine
}
private:
+ video::SColor m_menu_sky_color = video::SColor(255, 140, 186, 250);
+ video::SColor m_menu_clouds_color = video::SColor(255, 240, 240, 255);
static void settingChangedCallback(const std::string &name, void *data);
v2u32 _getWindowSize() const;
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index 5d2cbb0d1..6cfca45b2 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -276,6 +276,7 @@ void set_default_settings()
settings->setDefault("soft_clouds", "false");
settings->setDefault("cloud_radius", "12");
settings->setDefault("menu_clouds", "true");
+ settings->setDefault("menu_dark_theme", "false");
settings->setDefault("translucent_liquids", "true");
settings->setDefault("console_height", "0.6");
settings->setDefault("console_color", "(0,0,0)");
diff --git a/src/gui/guiEngine.cpp b/src/gui/guiEngine.cpp
index e1517065b..834fc2a5a 100644
--- a/src/gui/guiEngine.cpp
+++ b/src/gui/guiEngine.cpp
@@ -310,7 +310,7 @@ void GUIEngine::run()
driver->getFog(fog_color, fog_type, fog_start, fog_end, fog_density,
fog_pixelfog, fog_rangefog);
- driver->setFog(RenderingEngine::MENU_SKY_COLOR, fog_type, fog_start,
+ driver->setFog(m_rendering_engine->getMenuSkyColor(), fog_type, fog_start,
fog_end, fog_density, fog_pixelfog, fog_rangefog);
}
@@ -347,9 +347,10 @@ void GUIEngine::run()
m_script->handleMainMenuEvent("WindowInfoChange");
last_window_info = window_info;
}
-
- driver->beginScene(true, true, RenderingEngine::MENU_SKY_COLOR);
-
+
+ driver->beginScene(true, true, m_rendering_engine->getMenuSkyColor());
+ driver->setFog(m_rendering_engine->getMenuSkyColor());
+
if (m_clouds_enabled) {
drawClouds(dtime);
drawOverlay(driver);
@@ -403,10 +404,25 @@ GUIEngine::~GUIEngine()
/******************************************************************************/
void GUIEngine::drawClouds(float dtime)
{
+ g_menuclouds->update(v3f(0, 0, 0), m_rendering_engine->getMenuCloudsColor());
g_menuclouds->step(dtime * 3);
g_menucloudsmgr->drawAll();
}
+/******************************************************************************/
+void GUIEngine::setMainMenuCloudsColor(video::SColor& color)
+{
+m_rendering_engine->setMenuCloudsColor(color);
+}
+
+/******************************************************************************/
+void GUIEngine::setMainMenuSkyColor(video::SColor& color)
+{
+ m_rendering_engine->setMenuSkyColor(color);
+}
+
+
+
/******************************************************************************/
void GUIEngine::setFormspecPrepend(const std::string &fs)
{
@@ -425,7 +441,7 @@ void GUIEngine::drawBackground(video::IVideoDriver *driver)
/* If no texture, draw background of solid color */
if(!texture){
- video::SColor color(255,80,58,37);
+ video::SColor color = m_rendering_engine->getMenuSkyColor();
core::rect rect(0, 0, screensize.X, screensize.Y);
driver->draw2DRectangle(color, rect, NULL);
return;
diff --git a/src/gui/guiEngine.h b/src/gui/guiEngine.h
index da0700319..b63173a41 100644
--- a/src/gui/guiEngine.h
+++ b/src/gui/guiEngine.h
@@ -263,5 +263,8 @@ class GUIEngine {
/** is drawing of clouds enabled atm */
bool m_clouds_enabled = true;
+ void setMainMenuCloudsColor(video::SColor& color);
+ void setMainMenuSkyColor(video::SColor& color);
+
static void fullscreenChangedCallback(const std::string &name, void *data);
};
diff --git a/src/script/lua_api/l_client.cpp b/src/script/lua_api/l_client.cpp
index 584bd4f00..3ec775ae1 100644
--- a/src/script/lua_api/l_client.cpp
+++ b/src/script/lua_api/l_client.cpp
@@ -20,8 +20,7 @@
#include "util/string.h"
#include "nodedef.h"
-#define checkCSMRestrictionFlag(flag) \
- ( getClient(L)->checkCSMRestrictionFlag(CSMRestrictionFlags::flag) )
+#define checkCSMRestrictionFlag(flag) false
// Not the same as FlagDesc, which contains an `u32 flag`
struct CSMFlagDesc {
diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp
index bde7172c6..a96544ccc 100644
--- a/src/script/lua_api/l_mainmenu.cpp
+++ b/src/script/lua_api/l_mainmenu.cpp
@@ -218,7 +218,36 @@ int ModApiMainMenu::l_set_clouds(lua_State *L)
return 0;
}
+/******************************************************************************/
+int ModApiMainMenu::l_set_clouds_color(lua_State* L)
+{
+ GUIEngine* engine = getGuiEngine(L);
+ sanity_check(engine != NULL);
+
+ std::string value = readParam(L, 1);
+ video::SColor color = video::SColor();
+ parseColorString(value, color, false);
+
+ engine->setMainMenuCloudsColor(color);
+
+ return 0;
+}
+
+/******************************************************************************/
+int ModApiMainMenu::l_set_sky_color(lua_State* L)
+{
+ GUIEngine* engine = getGuiEngine(L);
+ sanity_check(engine != NULL);
+
+ std::string value = readParam(L, 1);
+ video::SColor color = video::SColor();
+ parseColorString(value, color, false);
+
+ engine->setMainMenuSkyColor(color);
+
+ return 0;
+}
/******************************************************************************/
int ModApiMainMenu::l_get_textlist_index(lua_State *L)
{
@@ -1078,6 +1107,8 @@ void ModApiMainMenu::Initialize(lua_State *L, int top)
API_FCT(update_formspec);
API_FCT(set_formspec_prepend);
API_FCT(set_clouds);
+ API_FCT(set_sky_color);
+ API_FCT(set_clouds_color);
API_FCT(get_textlist_index);
API_FCT(get_table_index);
API_FCT(get_worlds);
diff --git a/src/script/lua_api/l_mainmenu.h b/src/script/lua_api/l_mainmenu.h
index 48cc619dc..fdf00cda3 100644
--- a/src/script/lua_api/l_mainmenu.h
+++ b/src/script/lua_api/l_mainmenu.h
@@ -72,7 +72,11 @@ class ModApiMainMenu: public ModApiBase
static int l_set_topleft_text(lua_State *L);
- static int l_set_clouds(lua_State *L);
+ static int l_set_clouds(lua_State* L);
+
+ static int l_set_clouds_color(lua_State* L);
+
+ static int l_set_sky_color(lua_State* L);
static int l_get_textlist_index(lua_State *L);
diff --git a/src/server.cpp b/src/server.cpp
index f585e7705..444460bb0 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -589,11 +589,12 @@ void Server::start()
// ASCII art for the win!
const char *art[] = {
- R"( _ _ _ )",
- R"(| |_ _ __ _ _ __ | |_(_))",
- R"(| | | | |/ _` | '_ \| __| |)",
- R"(| | |_| | (_| | | | | |_| |)",
- R"(|_|\__,_|\__,_|_| |_|\__|_|)",
+ R"( ______ _ _ )",
+ R"(| ____| | | (_) )",
+ R"(| |__ _ __| |__ _ _ _ _ __ ___ )",
+ R"(| __| | '__| '_ \| | | | | '_ ` _ \ )",
+ R"(| |____| | | |_) | | |_| | | | | | |)",
+ R"(|______|_| |_.__/|_|\__,_|_| |_| |_|)",
};
if (!m_admin_chat) {
// we're not printing to rawstream to avoid it showing up in the logs.
diff --git a/textures/base/pack/menu_bg.png b/textures/base/pack/menu_bg.png
deleted file mode 100644
index 31aa93746..000000000
Binary files a/textures/base/pack/menu_bg.png and /dev/null differ