Need Help with Lua
BlitzMax Forums/BlitzMax Programming/Need Help with Lua| 
 | ||
| 
--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 | 
| 
 | ||
| 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)
 | 
| 
 | ||
| yes i see no problem with local so far | 
| 
 | ||
| Weird, most languages would give you issue with multiple scope declarations like that at the same level | 
| 
 | ||
| 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. | 
| 
 | ||
| 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 | 
| 
 | ||
| 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. | 
| 
 | ||
| 
--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" :) | 
| 
 | ||
| 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 | 
| 
 | ||
| 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()
 | 
| 
 | ||
| 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? | 
| 
 | ||
| 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 ? | 
| 
 | ||
| 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. | 
| 
 | ||
| \o/ thanks its fixed |