From 35c6361166db76689302ab47c49c285ab13c8c52 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Tue, 31 Aug 2010 18:37:30 +0000
Subject: [PATCH] TE4 will now auto update its engine from te4.org unless the
 executable file changed (rare)

git-svn-id: http://svn.net-core.org/repos/t-engine4@1117 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/engines/default/engine/version.lua       |  6 ++-
 .../default/special/mainmenu/class/Game.lua   |  7 ++--
 game/loader/init.lua                          | 39 +++++++++++--------
 src/core_lua.c                                |  5 +++
 4 files changed, 35 insertions(+), 22 deletions(-)

diff --git a/game/engines/default/engine/version.lua b/game/engines/default/engine/version.lua
index 7975bb63d7..09a7015693 100644
--- a/game/engines/default/engine/version.lua
+++ b/game/engines/default/engine/version.lua
@@ -18,11 +18,13 @@
 -- darkgod@te4.org
 
 -- Engine Version
-engine.version = {0,9,9,"te4"}
-engine.version_id = "te4-0.9.9"
+engine.version = {0,9,10,"te4",1}
+engine.require_c_core = engine.version[5]
+engine.version_id = ("%s-%d_%d.%d.%d"):format(engine.version[4], engine.require_c_core, engine.version[1], engine.version[2], engine.version[3])
 
 function engine.version_check(v)
 	local ev = engine.version
+	if v[5] ~= core.game.VERSION then return "bad C core" end
 	if v[4] ~= ev[4] then return "different engine" end
 	if v[1] > ev[1] then return "newer" end
 	if v[1] == ev[1] and v[2] > ev[2] then return "newer" end
diff --git a/game/engines/default/special/mainmenu/class/Game.lua b/game/engines/default/special/mainmenu/class/Game.lua
index 54f4bee0fb..3609343ab1 100644
--- a/game/engines/default/special/mainmenu/class/Game.lua
+++ b/game/engines/default/special/mainmenu/class/Game.lua
@@ -237,7 +237,7 @@ Now go and have some fun!]]
 	end
 	self.step.do_tooltip = true
 
---	self:installNewEngine()
+	self:installNewEngine()
 
 	if not self.firstrunchecked then
 		-- Check first time run for online profile
@@ -478,11 +478,12 @@ end
 
 function _M:installNewEngine()
 	if not self.latest_engine_version then return end
+	print("te4.org told us latest engine is", self.latest_engine_version[4], self.latest_engine_version[5], self.latest_engine_version[1], self.latest_engine_version[2], self.latest_engine_version[3])
 	if engine.version_check(self.latest_engine_version) == "newer" then
-		local url = ("http://te4.org/dl/engines/%s-%d.%d.%d.teae"):format(self.latest_engine_version[4], self.latest_engine_version[1], self.latest_engine_version[2], self.latest_engine_version[3])
+		local url = ("http://te4.org/dl/engines/%s_%d:%d.%d.%d.teae"):format(self.latest_engine_version[4], self.latest_engine_version[5], self.latest_engine_version[1], self.latest_engine_version[2], self.latest_engine_version[3])
 		local d = DownloadDialog.new(("Downloading: T-Engine 4 %d.%d.%d"):format(self.latest_engine_version[1], self.latest_engine_version[2], self.latest_engine_version[3]), url, function(di, data)
 			fs.mkdir("/engines")
-			local f = fs.open(("/engines/%s-%d.%d.%d.teae"):format(self.latest_engine_version[4], self.latest_engine_version[1], self.latest_engine_version[2], self.latest_engine_version[3]), "w")
+			local f = fs.open(("/engines/%s-%d_%d.%d.%d.teae"):format(self.latest_engine_version[4], self.latest_engine_version[5], self.latest_engine_version[1], self.latest_engine_version[2], self.latest_engine_version[3]), "w")
 			for i, v in ipairs(data) do f:write(v) end
 			f:close()
 
diff --git a/game/loader/init.lua b/game/loader/init.lua
index 9f073f5786..f91165821e 100644
--- a/game/loader/init.lua
+++ b/game/loader/init.lua
@@ -26,29 +26,34 @@ local args = {...}
 local req_engine = args[1] or "te4"
 local req_version = args[2] or "LATEST"
 
--- List all available engines
 local engines = {}
+
+local function tryLoadEngine(ff, dir, teae)
+	local env = {engine={}}
+	setfenv(ff, env)
+	pcall(ff)
+	if env.engine.version and env.engine.require_c_core == core.game.VERSION then
+		print("[ENGINE LOADER] available from "..(dir and "dir" or "teae")..": ", env.engine.version[4], env.engine.version[1], env.engine.version[2], env.engine.version[3])
+
+		local name = env.engine.version[4]
+		engines[name] = engines[name] or {}
+		engines[name][#engines[name]+1] = {env.engine.version[1], env.engine.version[2], env.engine.version[3], name, load_dir=dir, load_teae=teae}
+	end
+end
+
+-- List all available engines
 for i, f in ipairs(fs.list("/engines/")) do
 	if fs.exists("/engines/"..f.."/engine/version.lua") then
 		local ff, err = loadfile("/engines/"..f.."/engine/version.lua")
-		if ff and not err then
-			local env = {engine={}}
-			setfenv(ff, env)
-			pcall(ff)
-			if env.engine.version then
-				print("[ENGINE LOADER] available from directory: ", env.engine.version[4], env.engine.version[1], env.engine.version[2], env.engine.version[3])
-
-				local name = env.engine.version[4]
-				engines[name] = engines[name] or {}
-				engines[name][#engines[name]+1] = {env.engine.version[1], env.engine.version[2], env.engine.version[3], name, load_dir="/engines/"..f.."/"}
-			end
-		end
+		if ff and not err then tryLoadEngine(ff, "/engines/"..f.."/", nil) end
 	else
-		local _, _, name, vM, vm, vp = f:find("^([a-z0-9-]+)%-(%d+)%.(%d+)%.(%d+).teae$")
+		local _, _, name, cv, vM, vm, vp = f:find("^([a-z0-9-]+)%-(%d+)_(%d+)%.(%d+)%.(%d+).teae$")
 		if name then
-			print("[ENGINE LOADER] available from teae: ", name, vM, vm, vp)
-			engines[name] = engines[name] or {}
-			engines[name][#engines[name]+1] = {tonumber(vM), tonumber(vm), tonumber(vp), name, load_teae="/engines/"..f}
+			local eng_path = fs.getRealPath("/engines/"..f)
+			fs.mount(eng_path, "/tmp")
+			local ff, err = loadfile("/tmp/engine/version.lua")
+			if ff and not err then tryLoadEngine(ff, nil, "/engines/"..f) end
+			fs.umount(eng_path)
 		end
 	end
 end
diff --git a/src/core_lua.c b/src/core_lua.c
index 1920d62686..e286afa648 100644
--- a/src/core_lua.c
+++ b/src/core_lua.c
@@ -2098,7 +2098,12 @@ int luaopen_core(lua_State *L)
 	luaL_openlib(L, "core.display", displaylib, 0);
 	luaL_openlib(L, "core.mouse", mouselib, 0);
 	luaL_openlib(L, "core.key", keylib, 0);
+
 	luaL_openlib(L, "core.game", gamelib, 0);
+	lua_pushstring(L, "VERSION");
+	lua_pushnumber(L, 1);
+	lua_settable(L, -3);
+
 	luaL_openlib(L, "rng", rnglib, 0);
 	luaL_openlib(L, "line", linelib, 0);
 	luaL_openlib(L, "fs", fslib, 0);
-- 
GitLab