lualua-5.1

Lua 5.1 discover function signature


I am trying to redocument the mod library for a game called 'harvest massive encounter'

Their documentation that I was able to find:

http://www.oxeyegames.com/wiki/index.php/Harvest_Library

Redocumenting everything they have documented isn't an issue, I've also found a way to discover the hooks they did not document. But I am unable to figure out a way to discover their undocumented functions.

For example: harvest.defineActionButton seems like something that I would really want to discover to make cool actions on buildings available. Where defineUpgradeButton is also a button on a building, but also replaces it.

Sadly, this button is not documented but it does exist. If I do harvest.print(type(harvest.defineActionButton)) I get "function"

Sadly this game came out in 2007 and only supports Lua 5.1, so debug.getinfo does not give me nparams as I've read online that might have helped:

enter image description here

code:

local function onDebug()
    harvest.print(_VERSION)
    harvest.print(type(harvest.defineActionButton))

    local temp = debug.getinfo(harvest.defineActionButton)
    for key, value in pairs(temp) do
        harvest.print("key: " .. tostring(key))
        harvest.print("value: " .. tostring(value))
    end
end

hook.add("textInput", onDebug)

Any tips on how I can get the number of parameters on this function and maybe their name? (I would assume that expected type is impossible)

I have also attempted solutions found in:

How to get name of the argument in lua?

lua - get the list of parameter names of a function, from outside the function

But I am unable to make those solutions working


Solution

  • If the function was written in Lua, you can dump and analyze its bytecode with string.dump(f), which should include parameter info. If it's a C function, that's not possible (aside from statically analyzing the binary itself, which is a different category of question).

    If other attempts fail, you could try redefining the function with a fake one, like this...

    --...
    
    local defineActionButton_real = harvest.defineActionButton
    
    harvest.defineActionButton = function(...)
        print(...)
        return defineActionButton_real(...)
    end
    

    ...then observing the output when the game calls the fake function.