lua-users home
lua-l archive

Re: lua scripting implementation

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


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
 
 

AltStyle によって変換されたページ (->オリジナル) /