[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: lua scripting implementation
- From: Sean Conner <sean@...>
- Date: Fri, 6 Jun 2014 19:51:56 -0400
It was thus said that the Great Littlefield, Tyler once stated:
> Hello all:
> I've stepped away from this project for a while in terms of the
> scripting portion because I was getting a bit lost in implementation.
> What I wish to do is expose some APIs to the scripting engine so that
> content can be added through my game engine. This is essentially a mud,
> so the APIs exposed are for adding and modifying rooms, etc.
>
> I was hoping that perhaps someone could take a look at my code and just
> provide some pointers, or let me know if there's a better way to do what
> exists already. Most importantly, I'm curious if there are any good
> sandbox implementations using lua5.2, as setenv in 5.1 seems to be
> deprecated.
> Most of my lua specific code can be found here, in scr_*.cpp:
> https://github.com/sorressean/Aspen/tree/master/src/scripts
> I'm sorry for the direct link--I did not want to provide a couple
> thousand lines of code as an example. Any information would be greatly
> appreciated.
> Thanks,
I'm looking at scr_entity.cpp. I see that you create a metatable for
entities, but you don't seem to be using it to full effect. If you go to
the trouble, then your code can be simplified quite a bit:
#define GAME_ENTITY "entity"
int SCR_NewEntity(lua_State *L)
{
Entity *entity;
entity = lua_newuserdata(L,1,sizeof(Entity));
/* initialize entity */
luaL_getmetatable(L,GAME_ENTITY);
lua_setmetatable(L,-2);
return 1;
}
int SCR_GetName(lua_State *L)
{
Entity *entity;
std::string name;
entity = luaL_checkudata(L,1,GAME_ENTITY);
name = entity->GetName();
lua_pushstring(L,name.c_str());
return 1;
}
int SCR_SetName(lua_state *L)
{
Entity *entity = luaL_checkudata(L,1,GAME_ENTITY);
const char *name = luaL_checkstring(L,2);
entity->SetName(name);
return 0;
}
int SCR_MoveTo(lua_State *L)
{
Entity *src = luaL_checkudata(L,1,GAME_ENTITY);
Entity *target = luaL_checkudata(L,2,GAME_ENTITY);
lua_pushboolean(L,src->MoveTo(target));
return 1;
}
The luaL_check*() functions do the appropriate error checking, so you
don't have to.
Another thing to look out for---duplicating functions that already exist
in Lua. I noticed SCR_TypeToStr(), which does the same thing as
luaL_type().
As for sandboxing, there are two ways---one way is to only include in the
global scope only those functions you want. Sections 2.2, 3.2 and 3.3 of
the Lua 5.2 manual cover this.
-spc