From a086f402e220dffaee48b86555feb8eed4048eae Mon Sep 17 00:00:00 2001
From: magicfelix <felix@felix-zauberer.de>
Date: Mon, 4 Mar 2024 23:28:04 +0100
Subject: [PATCH] Allow custom category functionality

---
 src/game.lua | 45 ++++++++++++++++++++++++++++++++-------------
 1 file changed, 32 insertions(+), 13 deletions(-)

diff --git a/src/game.lua b/src/game.lua
index 520312c..c8b06fb 100644
--- a/src/game.lua
+++ b/src/game.lua
@@ -2,46 +2,65 @@ local storage = minetest.get_mod_storage()
 
 local games = {}
 
+local Category = {}
 local Game = {}
 
-function Game.get_stat(self, player, category)
-	return storage:get_int("STATS." .. self.mod.. "." .. player .. "." .. category)
+function Category.get_stat(self, player)
+	return storage:get_int("STATS." .. self.game.mod .. "." .. player .. "." .. self.name)
 end
 
-function Game.set_stat(self, player, category, value)
-	storage:set_int("STATS." .. self.mod .. "." .. player .. "." .. category, value)
+function Category.set_stat(self, player, value)
+	storage:set_int("STATS." .. self.game.mod .. "." .. player .. "." .. self.name, value)
 end
 
-function Game.increment_stat(self, player, category, difference)
-	local current = self:get_stat(player, category)
+function Category.increment_stat(self, player, difference)
+	minetest.log(dump(self))
+	local current = self:get_stat(player)
 	if current == nil then
 		current = 0
 	end
-	self:set_stat(player, category, current + difference)
+	self:set_stat(player, current + difference)
+end
+
+function Category.new(game, name, display_name, get, set, custom)
+	local category = {
+		game = game,
+		name = name,
+		display_name = display_name,
+		get_stat = get or Category.get_stat,
+		set_stat = set or Category.set_stat,
+	}
+	if custom then
+		for name, func in pairs(custom) do
+			category[name] = func
+		end
+	else
+		category.increment_stat = Category.increment_stat
+	end
+	return category
+
 end
 
 function Game.get_stats(self, target)
 	local output = self.display_name .. " statistics of " .. target
 	for c_name, category in pairs(self.categories) do
-		output = output .. "\n" .. category.display_name .. ": " .. self:get_stat(target, c_name)
+		output = output .. "\n" .. category.display_name .. ": " .. category:get_stat(target)
 	end
 	return true, output
 end
 
-function Game.register(mod, name, display_name, categories)
+function Game.register(mod, name, display_name)
 	local game = {
 		mod = mod,
 		name = name,
 		display_name = display_name,
-		categories = categories,
-		get_stat = Game.get_stat,
-		set_stat = Game.set_stat,
-		increment_stat = Game.increment_stat,
 		get_stats = Game.get_stats,
+		categories = {},
 	}
 	games[mod] = game
 	return game
 end
 
 magic_stats.games = games
+magic_stats.Category = Category
 magic_stats.Game = Game
-- 
GitLab