1if not stead.api_atleast(1, 6, 3) then
2	error ("Counters module can not run with api version < 1.6.3", 3)
3end
4
5local function inc_nr(v, n)
6	local name = '__'..n..'_nr'
7	if not v[name] then
8		v[name] = 0
9	end
10	v[name] = v[name] + 1
11end
12
13local function read_nr(v, n, set)
14	local name = '__'..n..'_nr'
15	v = stead.ref(v)
16	if stead.type(v) ~= 'table' then
17		return v
18	end
19	if not v[name] then
20		if stead.type(set) == 'number' then v[name] = set end
21		return 0
22	end
23	n = v[name]
24	if stead.type(set) == 'number' then v[name] = set end
25	return n
26end
27
28game.onact = stead.hook(game.onact, function(f, v, w, ...)
29	inc_nr(v, 'act');
30	inc_nr(w, 'act');
31	return f(v, w, ...)
32end)
33
34game.onuse = stead.hook(game.onuse,
35function(f, v, w, ...)
36	inc_nr(v, 'use');
37	inc_nr(w, 'use');
38	return f(v, w, ...)
39end)
40
41game.oninv = stead.hook(game.oninv,
42function(f, v, w, ...)
43	inc_nr(v, 'inv');
44	inc_nr(w, 'inv');
45	return f(v, w, ...)
46end)
47
48game.onwalk = stead.hook(game.onwalk,
49function(f, v, w, ...)
50	inc_nr(v, 'walk');
51	inc_nr(w, 'walk');
52	return f(v, w, ...)
53end)
54
55function act_count(s, v)
56	if not s and not v then
57		s = game
58		v = nil
59	elseif stead.tonum(s) then
60		v = s
61		s = game
62	end
63	return read_nr(s, 'act', v)
64end
65
66function inv_count(s, v)
67	if not s and not v then
68		s = game
69		v = nil
70	elseif stead.tonum(s) then
71		v = s
72		s = game
73	end
74	return read_nr(s, 'inv', v)
75end
76
77function use_count(s, v)
78	if not s and not v then
79		s = game
80		v = nil
81	elseif stead.tonum(s) then
82		v = s
83		s = game
84	end
85	return read_nr(s, 'use', v)
86end
87
88function walk_count(s, v)
89	if not s and not v then
90		s = game
91		v = nil
92	elseif stead.tonum(s) then
93		v = s
94		s = game
95	end
96	return read_nr(s, 'walk', v)
97end
98