mirror of
https://github.com/notwa/mm
synced 2024-11-14 09:09:02 -08:00
move actor iteration funcs to their own file
This commit is contained in:
parent
bc6037092e
commit
2e42819b99
2 changed files with 119 additions and 115 deletions
|
@ -3,12 +3,14 @@ require "boilerplate"
|
||||||
require "addrs.init"
|
require "addrs.init"
|
||||||
require "messages"
|
require "messages"
|
||||||
require "classes"
|
require "classes"
|
||||||
|
require "actors"
|
||||||
|
|
||||||
local suffix = oot and " oot" or ""
|
local suffix = oot and " oot" or ""
|
||||||
local damage_names = require("data.damage names"..suffix)
|
local damage_names = require("data.damage names"..suffix)
|
||||||
|
|
||||||
-- check for errors in the actor linked lists
|
-- creating an object every time is a bit slow, so
|
||||||
local validate = false
|
-- using a template to offset from will do for now.
|
||||||
|
local actor_t = Actor(0)
|
||||||
|
|
||||||
-- for figuring out actor variables
|
-- for figuring out actor variables
|
||||||
local debug_mode = false
|
local debug_mode = false
|
||||||
|
@ -36,97 +38,6 @@ local debug_watch = mm and {
|
||||||
{'unk_78', '%9.3f'},
|
{'unk_78', '%9.3f'},
|
||||||
} or {}
|
} or {}
|
||||||
|
|
||||||
-- creating an object every time is a bit slow, so
|
|
||||||
-- using a template to offset from will do for now.
|
|
||||||
local actor_t = Actor(0)
|
|
||||||
|
|
||||||
function sort_by_key(t)
|
|
||||||
local sorted = {}
|
|
||||||
local i = 1
|
|
||||||
for k, v in pairs(t) do
|
|
||||||
sorted[i] = {k=k, v=v}
|
|
||||||
i = i + 1
|
|
||||||
end
|
|
||||||
table.sort(sorted, function(a, b) return a.k < b.k end)
|
|
||||||
return sorted
|
|
||||||
end
|
|
||||||
|
|
||||||
function get_actor_count(i)
|
|
||||||
return R4(addrs.actor_counts[i].addr)
|
|
||||||
end
|
|
||||||
|
|
||||||
function get_first_actor(i)
|
|
||||||
return deref(R4(addrs.actor_firsts[i].addr))
|
|
||||||
end
|
|
||||||
|
|
||||||
function get_next_actor(addr)
|
|
||||||
return deref(R4(addr + actor_t.next.addr))
|
|
||||||
end
|
|
||||||
|
|
||||||
function get_prev_actor(addr)
|
|
||||||
return deref(R4(addr + actor_t.prev.addr))
|
|
||||||
end
|
|
||||||
|
|
||||||
function count_actors()
|
|
||||||
local counts = {}
|
|
||||||
for i = 0, 11 do
|
|
||||||
counts[i] = get_actor_count(i)
|
|
||||||
end
|
|
||||||
return counts
|
|
||||||
end
|
|
||||||
|
|
||||||
function iter_actors(counts)
|
|
||||||
local at, ai = 0, 0
|
|
||||||
local addr
|
|
||||||
|
|
||||||
local y = 1
|
|
||||||
local complain = function(s)
|
|
||||||
s = s..(" (%2i:%3i)"):format(at, ai)
|
|
||||||
T_TR(0, y, "yellow", s)
|
|
||||||
y = y + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
local iterate
|
|
||||||
iterate = function()
|
|
||||||
if ai == 0 then
|
|
||||||
addr = get_first_actor(at)
|
|
||||||
if validate and addr and get_prev_actor(addr) then
|
|
||||||
complain("item before first")
|
|
||||||
end
|
|
||||||
else
|
|
||||||
local prev = addr
|
|
||||||
addr = get_next_actor(addr)
|
|
||||||
if validate then
|
|
||||||
if addr and prev ~= get_prev_actor(addr) then
|
|
||||||
complain("previous mismatch")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if not addr then
|
|
||||||
if validate then
|
|
||||||
if ai < counts[at] then
|
|
||||||
-- known case: romani ranch on first/third night
|
|
||||||
complain("list ended early")
|
|
||||||
elseif ai > counts[at] then
|
|
||||||
complain("list ended late")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
ai = 0
|
|
||||||
at = at + 1
|
|
||||||
if at == 12 then return nil end
|
|
||||||
return iterate()
|
|
||||||
else
|
|
||||||
local temp = ai
|
|
||||||
ai = ai + 1
|
|
||||||
return at, temp, addr
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return iterate
|
|
||||||
end
|
|
||||||
|
|
||||||
function longbinary(x)
|
function longbinary(x)
|
||||||
return ('%032s'):format(bizstring.binary(x))
|
return ('%032s'):format(bizstring.binary(x))
|
||||||
end
|
end
|
||||||
|
@ -197,28 +108,6 @@ function focus(actor, dump)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function collect_actors()
|
|
||||||
local game_counts = count_actors()
|
|
||||||
local any = 0
|
|
||||||
for i = 0, 11 do
|
|
||||||
any = any + game_counts[i]
|
|
||||||
--FIXME: T_BR(0, 13 - i, nil, "#%2i: %2i", i, game_counts[i])
|
|
||||||
end
|
|
||||||
--FIXME: T_BR(0, 1, nil, "sum:%3i", any)
|
|
||||||
|
|
||||||
local actors_by_type = {[0]={},{},{},{},{},{},{},{},{},{},{},{}} -- 12
|
|
||||||
local new_counts = {[0]=0,0,0,0,0,0,0,0,0,0,0,0} -- 12
|
|
||||||
if any > 0 then
|
|
||||||
any = 0
|
|
||||||
for at, ai, addr in iter_actors(game_counts) do
|
|
||||||
actors_by_type[at][ai] = addr
|
|
||||||
new_counts[at] = new_counts[at] + 1
|
|
||||||
any = any + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return any > 0, actors_by_type, new_counts
|
|
||||||
end
|
|
||||||
|
|
||||||
local input_handler = InputHandler{
|
local input_handler = InputHandler{
|
||||||
enter = "P1 L",
|
enter = "P1 L",
|
||||||
up = "P1 DPad U",
|
up = "P1 DPad U",
|
||||||
|
|
115
Lua/actors.lua
Normal file
115
Lua/actors.lua
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
-- check for errors in the actor linked lists
|
||||||
|
local validate = false
|
||||||
|
|
||||||
|
-- creating an object every time is a bit slow, so
|
||||||
|
-- using a template to offset from will do for now.
|
||||||
|
local actor_t = Actor(0)
|
||||||
|
|
||||||
|
function sort_by_key(t)
|
||||||
|
local sorted = {}
|
||||||
|
local i = 1
|
||||||
|
for k, v in pairs(t) do
|
||||||
|
sorted[i] = {k=k, v=v}
|
||||||
|
i = i + 1
|
||||||
|
end
|
||||||
|
table.sort(sorted, function(a, b) return a.k < b.k end)
|
||||||
|
return sorted
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_actor_count(i)
|
||||||
|
return R4(addrs.actor_counts[i].addr)
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_first_actor(i)
|
||||||
|
return deref(R4(addrs.actor_firsts[i].addr))
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_next_actor(addr)
|
||||||
|
return deref(R4(addr + actor_t.next.addr))
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_prev_actor(addr)
|
||||||
|
return deref(R4(addr + actor_t.prev.addr))
|
||||||
|
end
|
||||||
|
|
||||||
|
function count_actors()
|
||||||
|
local counts = {}
|
||||||
|
for i = 0, 11 do
|
||||||
|
counts[i] = get_actor_count(i)
|
||||||
|
end
|
||||||
|
return counts
|
||||||
|
end
|
||||||
|
|
||||||
|
function iter_actors(counts)
|
||||||
|
local at, ai = 0, 0
|
||||||
|
local addr
|
||||||
|
|
||||||
|
local y = 1
|
||||||
|
local complain = function(s)
|
||||||
|
s = s..(" (%2i:%3i)"):format(at, ai)
|
||||||
|
T_TR(0, y, "yellow", s)
|
||||||
|
y = y + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
local iterate
|
||||||
|
iterate = function()
|
||||||
|
if ai == 0 then
|
||||||
|
addr = get_first_actor(at)
|
||||||
|
if validate and addr and get_prev_actor(addr) then
|
||||||
|
complain("item before first")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local prev = addr
|
||||||
|
addr = get_next_actor(addr)
|
||||||
|
if validate then
|
||||||
|
if addr and prev ~= get_prev_actor(addr) then
|
||||||
|
complain("previous mismatch")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not addr then
|
||||||
|
if validate then
|
||||||
|
if ai < counts[at] then
|
||||||
|
-- known case: romani ranch on first/third night
|
||||||
|
complain("list ended early")
|
||||||
|
elseif ai > counts[at] then
|
||||||
|
complain("list ended late")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ai = 0
|
||||||
|
at = at + 1
|
||||||
|
if at == 12 then return nil end
|
||||||
|
return iterate()
|
||||||
|
else
|
||||||
|
local temp = ai
|
||||||
|
ai = ai + 1
|
||||||
|
return at, temp, addr
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return iterate
|
||||||
|
end
|
||||||
|
|
||||||
|
function collect_actors()
|
||||||
|
local game_counts = count_actors()
|
||||||
|
local any = 0
|
||||||
|
for i = 0, 11 do
|
||||||
|
any = any + game_counts[i]
|
||||||
|
--FIXME: T_BR(0, 13 - i, nil, "#%2i: %2i", i, game_counts[i])
|
||||||
|
end
|
||||||
|
--FIXME: T_BR(0, 1, nil, "sum:%3i", any)
|
||||||
|
|
||||||
|
local actors_by_type = {[0]={},{},{},{},{},{},{},{},{},{},{},{}} -- 12
|
||||||
|
local new_counts = {[0]=0,0,0,0,0,0,0,0,0,0,0,0} -- 12
|
||||||
|
if any > 0 then
|
||||||
|
any = 0
|
||||||
|
for at, ai, addr in iter_actors(game_counts) do
|
||||||
|
actors_by_type[at][ai] = addr
|
||||||
|
new_counts[at] = new_counts[at] + 1
|
||||||
|
any = any + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return any > 0, actors_by_type, new_counts
|
||||||
|
end
|
Loading…
Reference in a new issue