• Create Account

## Issues with embedding Lua

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

3 replies to this topic

### #1GrimV5  Members

Posted 27 March 2014 - 09:55 PM

While working on item and npc classes, I've decided to use Lua for scripting and data.  I have Lua installed and I do Have Lua setup properly in VS 2010 but I am still having a few problems.

1) The program (my test project I am using to get familiar with lua embedding) can't find my .lua script, I've put it in every possible location in the project folder but it can't find it.

2) I've looked at a bunch of tutorials, but for the most part they only show simple data and function calling.  What I'm looking for is to a way to access individual pieces of data from a structure like in my .lua script:

player = {
name = "simon",
level = 1,
class = "warrior"
}


like looking up name and then class. Does someone know how I could do that, or at least know of a tutorial (that I haven't found) that explains this?

3)Finally, though not as important at the moment (for now), I've noticed that certain lines of code cause the VS debugger to skip all of the breakpoints that I had setup when it reaches one of said lines.  These lines are luaopen_io and luaopen_string (that I have so far seen), what's up with that?

Here is my .cpp file with what I have tried to do:

#include<iostream>
#include<stdio.h>
#include<string>

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

int main(){
std::cout << "test print" << std::endl;
lua_State *lua = lua_open();
luaopen_base(lua);
int error = luaL_dofile(lua, "player.lua");
if(error){
std::cout << error;
}
lua_getglobal(lua,"player.name");
std::cout << lua_tostring(lua, -1) << std::endl;
}


I don't even know if the last few lines will even work because it can't find the .lua script.

### #2Endurion  Members

Posted 28 March 2014 - 12:17 AM

Lua doesn't really provide comfortable ways, you need to work with the stack closely. The upside is, pretty much everything works the same way.

For your script, "player" is a table. So you need to push the player object on the stack. Then you can iterate over its members.

Here's a function I'm using for this, you may need to exchange a few functions for raw lua code. Also yes, it's old and ugly, but it does its job:

std::string CLuaInstance::GetVar( const std::string& strVarName )
{
size_t iOldPos = 0;
int iPushedParams = 0;
int iTruePushedParams = 0;
std::string strLastTable;
while ( true )
{
size_t iDotPos = strVarName.find( '.', iOldPos );
if ( iDotPos == std::string::npos )
{
// true variable
if ( iTruePushedParams == 0 )
{
return GetGlobal( strVarName );
}
PushString( strVarName.substr( iOldPos ) );
++iTruePushedParams;
lua_rawget( m_LuaInstance, -2 );
std::string strResult = ToString( -1 );
//dh::Log( "Type: %s", lua_typename( m_LuaInstance, lua_type( m_LuaInstance, -1 ) ) );
PopAll();
return strResult;
}
strLastTable = strVarName.substr( iOldPos, iDotPos - iOldPos );
++iTruePushedParams;
if ( iTruePushedParams == 1 )
{
// fetch from the global table
lua_getglobal( m_LuaInstance, strLastTable.c_str() );
//lua_gettable( m_LuaInstance, LUA_GLOBALSINDEX );
}
else
{
PushString( strLastTable );
lua_rawget( m_LuaInstance, -2 );
}
if ( !lua_istable( m_LuaInstance, -1 ) )
{
PopAll();
dh::Error( _T( "LuaInstance:GetVar - no table %s" ), strVarName.substr( 0, iDotPos ).c_str() );
return std::string();
}
iOldPos = iDotPos + 1;
}
}



Fruny: Ftagn! Ia! Ia! std::time_put_byname! Mglui naflftagn std::codecvt eY'ha-nthlei!,char,mbstate_t>

### #3SimonForsman  Members

Posted 28 March 2014 - 12:20 AM

For 1)

IIRC Visual Studio will use the projects "Debug" folder by default.

I don't suffer from insanity, I'm enjoying every minute of it.
The voices in my head may not be real, but they have some good ideas!

### #4ProtectedMode  Members

Posted 28 March 2014 - 04:26 AM

Why not use a simple library that's easier to use? Then you would do something like this:

LuaContext lua;
lua.executeCode(std::ifstream{"script.lua"});