Fio:LuaBinder

From Fio

"Like a bridge over troubled water..." - Simon and Garfunkel

still in ctoring

Contents

[edit] Lua Binder

Fio use Lua as scripting language to implement the game logic which include(in a broad sense):

  • UI design and switching
  • event handler
  • combat scheduler
  • npc behavior

All the logics/policies are build on the mechanisms carried out by c++ classes which will do the real work of rendering, timing, event dispatching etc. This separation is to make the game fully data driven - thru scripting the logic itself is taken as data which can be easily modified without the re-compile-link of the mechanism part(or the engine).

Lua has provided a bunch of APIs for "the host program to communicate with Lua". To call function from lua into c++, we have to:

  • extract the arguments from lua stack;
  • check the argument/return value type;
  • call c++ function;
  • push the return value onto lua stack;
  • take care the return value's lifetime.

thru Lua APIs.

As the number of classes needs to be embedded into lua increases, these routine work will be a burden to write and maintain for each function call. There're quite a few binders out there to make the embedding easier. In Fio we implement a home brew binder - LuaUtil as a bridge between the c++ and lua world.(Not-Invented-Here Syndrome? no, it's just for better understanding of the scripting and faster compiling speed)

[edit] Quick Tour

Thru the lua API, we can create a metatable and register our c++ class' member functions there. Then we associate that metatable with the according c++ object(lurk in lua as a userdata/lightuserdata). Later when trying to call one of the member function on an object in lua, the binder'll check the calling stack of lua to find the this object(self in lua) and all arguments passed in, do some type checking then finally invoke the registered member function and push the returned value onto lua stack(if necessary).

The Object-Oriented Access chapter of Programming in Lua describes this process in detail.

[edit] The Lua Application Program Interface

[edit] Construct An Object

C++ objects live in lua in two types of data:

  • userdata
  • lightweight userdata

Userdata can be garbage collected(gced) when it's no longer needed while lightweight userdata will not be collected.

  • why userdata is not enough?

[edit] Method Invoking

  • method wrap

[edit] from lua into c++

  • traits
  • Overload

[edit] from c++ into lua

callback?

[edit] Type Checking

[edit] LSP

[edit] Destruct & Object Lifetime in the 2 Worlds

[edit] Misc

  • const
  • panic
  • utility functions
Personal tools