Need Help with Lua

BlitzMax Forums/BlitzMax Programming/Need Help with Lua

Duckstab[o](Posted 2009) [#1]
--Lua_Spell.lua

Spell = {}
setmetatable(Spell, {__mode="v"})

function Create_Spell(name,class,area,target,damage,cost)
	local i = {
		__Name = name,
		_Class = class,
		__Area = area,
		Target = target,
		Damage = damage,
		__Cost   = cost,
	},
	table.insert(Spell,i)
	return i
end


local i = Create_Spell("FIRE I","FIRE",1,"SINGLE",10,10)
local i = Create_Spell("FIRE II","FIRE",1,"SINGLE",20,25)
local i = Create_Spell("FIRE III","FIRE",1,"SINGLE",40,60)
local i = Create_Spell("FIRE IV","FIRE",1,"SINGLE",80,130)
local i = Create_Spell("FIRE V","FIRE",1,"SINGLE",160,270)


function FindSpell_name(name)
	for x,v in pairs(Spell) do 
		for y,z in pairs(x) do
			if z==name then 
			return(y)
			end
		end
	end
end

function FindSpell_class(class)
	for x,v in pairs(Spell) do 
		for y,z in pairs(x) do
			if z==class then 
			return(y)
			end
		end
	end
end

function DumpStat(i)
	for x,v in pairs(i) do 
	PrintPairs(x,v) 
	end
end



What a am trying to do in bmax is request the pointer to the spell
then in bmax call the function Dumpstat passing the pointer back to Lua

Function lPrintPairs( L:Byte Ptr )
	Local keys:Int = lua_gettop(L)
	For i = 1 To keys Step 2
		Local Word$
		If lua_isnumber(L,i) = True
			Word$:+lua_tointeger (L,i)
		Else
			Word$:+String(lua_tostring (L,i))
		EndIf
		Word$:+":"
		If lua_isnumber(L,i+1) = True
			Word$:+lua_tointeger (L,i+1)
		Else
			Word$:+String(lua_tostring (L,i+1))
		EndIf
		Print Word$
	Next
	Return 0
End Function


but i dont know how to add arguments to function calls from bmax or how to store the pointer in bmax allowing me to instant access in Lua without having to keep searching


_Skully(Posted 2009) [#2]
Unrelated to the actual issue can you declare i as local 5 times in a row in Lua?

local i = Create_Spell("FIRE I","FIRE",1,"SINGLE",10,10)
local i = Create_Spell("FIRE II","FIRE",1,"SINGLE",20,25)
local i = Create_Spell("FIRE III","FIRE",1,"SINGLE",40,60)
local i = Create_Spell("FIRE IV","FIRE",1,"SINGLE",80,130)
local i = Create_Spell("FIRE V","FIRE",1,"SINGLE",160,270)



Duckstab[o](Posted 2009) [#3]
yes i see no problem with local so far


_Skully(Posted 2009) [#4]
Weird, most languages would give you issue with multiple scope declarations like that at the same level


N(Posted 2009) [#5]
I'm not entirely sure what you're asking, what this "pointer" is you're talking about, etc.

As far as passing arguments to Lua functions, please read the manual.

Unrelated to the actual issue can you declare i as local 5 times in a row in Lua?
You can, but I don't know why you would when you could just reuse the variable.


Duckstab[o](Posted 2009) [#6]
what im trying to do is create a search function in lua to find a spell by name.

Then store this spells index and pass it to bmax so from bmax i can call the
function DumpStat(i)
	for x,v in pairs(i) do 
	PrintPairs(x,v) 
	end
end

without having to search for the spell again


N(Posted 2009) [#7]
So you want to store the result of one of the Find functions, then later pass it back to DumpStat? If so, just store the return value of the function after calling it in BlitzMax (hopefully you clicked the link to the manual I gave you, since it explained how to call functions and such). If that's not what you want to do, do you have any examples of how you'd expect to be doing this (forget about trying to make it look like a real application, pseudo code is easier to illustrate a problem with).

Also, what's with the arbitrary number of underscores in the table keys, and the somewhat absurd way you've written the find functions? I mean, as it stands, I don't think you're going to get any results from the find functions. At worst, they're liable to cause an error when calling them.


Duckstab[o](Posted 2009) [#8]
--Lua_Spell.lua

Spell = {}
setmetatable(Spell, {__mode="v"})

function Create_Spell(name,class,area,target,damage,cost)
	spells = {
		Name = name,
		Class = class,
		Area = area,
		Target = target,
		Damage = damage,
		Cost   = cost,
	},
	table.insert(Spell,spells)
end


Create_Spell("FIRE I","FIRE",1,"SINGLE",10,10)
Create_Spell("FIRE II","FIRE",1,"SINGLE",20,25)
Create_Spell("FIRE III","FIRE",1,"SINGLE",40,60)
Create_Spell("FIRE IV","FIRE",1,"SINGLE",80,130)
Create_Spell("FIRE V","FIRE",1,"SINGLE",160,270)


function FindSpellname(name)
	local k=nil
	local v=nil
	for k,v in pairs(Spell) do
		if v.Name==name then 
			DumpPairs(v)
		end
	end
end

function DumpPairs(temp)
	local k=nil
	local v=nil
	for k,v in pairs(temp) do 
	PrintPairs(k,v) 
	end
end

FindSpellname("FIRE IV")
FindSpellname("FIRE I")
FindSpellname("FIRE V")



'My_Lua_Engine.bmx

Global lua_state:Byte Ptr					= Null

	
	OnEnd(KillLuaState)
	lua_state = luaL_newstate()
	
	' Load base, math, table, and os libraries
	luaopen_base(lua_state)
	luaopen_math(lua_state)
	luaopen_table(lua_state)
	luaopen_os(lua_state)
	
	lua_register( lua_state, "Print", lPrint )
	lua_register( lua_state, "PrintPairs", lPrintPairs )

StartTheApp()


Function KillLuaState()
	If lua_state Then
		lua_close(lua_state)
		lua_state = Null
	EndIf
End Function

Function StartTheApp()
	LoadScript("Lua_Spell.lua")
End Function

Function LoadScript(_String$)
	Local error:String
	If luaL_dofile( lua_state, _String$ ) Then
		error:String = lua_tostring( lua_state, -1 )
		lua_pop( lua_state, 1 )
		RuntimeError(error)
	EndIf
End Function

Function lPrint( L:Byte Ptr )
	Local keys:Int = lua_gettop(L)
	For i = 1 To keys 
	If lua_isnumber(L,i) = True
	Print lua_tointeger (L,i)
	Else
	Print String(lua_tostring (L,i))
	EndIf
	Next
	Return 0
End Function

Function lPrintPairs( L:Byte Ptr )
	Local keys:Int = lua_gettop(L)
	For i = 1 To keys Step 2
		Local Word$
		If lua_isnumber(L,i) = True
			Word$:+lua_tointeger (L,i)
		Else
			Word$:+String(lua_tostring (L,i))
		EndIf
		Word$:+":"
		If lua_isnumber(L,i+1) = True
			Word$:+lua_tointeger (L,i+1)
		Else
			Word$:+String(lua_tostring (L,i+1))
		EndIf
		Print Word$
	Next
	Return 0
End Function



Ive managed to get the search function sorted but now there is a issue when trying to get the last item added to the table ie "FIRE V" any idea whats up with that.

please post a Bmax function calling FindSpellname(name) and Passing the String "FIRE III" :)


Duckstab[o](Posted 2009) [#9]
Function lua_dumpStat(_name$)
	lua_getglobal( lua_state, "FindSpellname" )
			If lua_type( lua_state, -1 ) = LUA_TFUNCTION Then
				lua_pushstring ( lua_state, _name$ )
				If lua_pcall( lua_state, 1, 0, 0 ) Then
					Local error:String = lua_tostring( lua_state, -1 )
					lua_pop( lua_state, 1 )
					RuntimeError(error)
				EndIf
			Else
				lua_pop( lua_state, 1 )
			EndIf
EndFunction



well thats that sorted now


Duckstab[o](Posted 2009) [#10]
by changing the spellcreation part and adding in a blank spell at the end allows me to get "FIRE V" so somethings up with the Table

Create_Spell("FIRE I","FIRE",1,"SINGLE",10,10)
Create_Spell("FIRE II","FIRE",1,"SINGLE",20,25)
Create_Spell("FIRE III","FIRE",1,"SINGLE",40,60)
Create_Spell("FIRE IV","FIRE",1,"SINGLE",80,130)
Create_Spell("FIRE V","FIRE",1,"SINGLE",160,270)
Create_Spell()



N(Posted 2009) [#11]
I'm not sure what you mean. All you're doing there is adding an empty table ({}) to the Spell table when you call it without providing any parameters. Either way, why are you even excluding the parameters?


Duckstab[o](Posted 2009) [#12]
The problem is when i do this lua function

Create_Spell("FIRE I","FIRE",1,"SINGLE",10,10)
Create_Spell("FIRE II","FIRE",1,"SINGLE",20,25)
Create_Spell("FIRE III","FIRE",1,"SINGLE",40,60)
Create_Spell("FIRE IV","FIRE",1,"SINGLE",80,130)
Create_Spell("FIRE V","FIRE",1,"SINGLE",160,270)

function PrintallSpells()
	local k=nil
	local v=nil
	for k,v in pairs(Spell) do 
			DumpPairs(v)
		end
	end
end


I only get Spells FIRE I to FIRE IV returned

but if create another spell then try the PrintallSpells function it now prints from FIRE I to FIRE V so for some reason the function is not getting the last pair

any ideas how to fix this ?
or is the a better approach to looping over the Spell table ?


N(Posted 2009) [#13]
Your problem is the comma you have after your } in the create spell function. Not sure why that's there, but it shouldn't be.


Duckstab[o](Posted 2009) [#14]
\o/ thanks its fixed