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