| name | add-lua-binding-simple |
| description | Add simple Cataclysm-BN Lua bindings for string_id types, enums, and basic read-only C++ types. Use when exposing straightforward C++ types to Lua. |
| metadata | {"argument-hint":"TypeName [output-file]"} |
Add Simple Lua Binding
This skill helps you add Lua bindings for simple C++ types like string_id, enums, or basic classes.
What You'll Do
- Identify the type you want to bind (e.g.,
my_type, my_enum)
- Choose the binding file (usually
src/catalua_bindings_ids.cpp for IDs, or a relevant catalua_bindings_*.cpp)
- Add Luna documentation macro to
src/catalua_luna_doc.h
- Register the binding in the appropriate function
- Build and test the changes
Step-by-Step Instructions
For string_id types
LUNA_ID( my_type, "MyType" )
reg_id<my_type, has_int_id>( lua );
For enum types
LUNA_ENUM( my_enum, "MyEnum" )
{
auto values = sol::initializers(
"VALUE_ONE", my_enum::VALUE_ONE,
"VALUE_TWO", my_enum::VALUE_TWO
);
luna::set_enum( lua, values );
}
Note: Use trailing return types and auto throughout (see patterns below).
For simple data types (read-only)
LUNA_DOC( my_class, "MyClass" )
#define UT_CLASS my_class
{
auto ut = luna::new_usertype<UT_CLASS>(
lua,
luna::no_bases,
luna::no_constructor
);
SET_MEMB( my_field );
SET_MEMB_RO( const_field );
SET_FX( my_method );
}
#undef UT_CLASS
Important Patterns
Documentation Comments
DOC( "Description of the type" );
DOC( "Additional details about usage" );
Member Macros
SET_MEMB(name) - Mutable member variable or property
SET_MEMB_RO(name) - Read-only member
SET_FX(name) - Member function
SET_FX_T(name, signature) - Member function with specific overload
Luna Macros
LUNA_ID(CppType, "LuaName") - For string_id/int_id pairs
LUNA_DOC(CppType, "LuaName") - For documentation-only types
LUNA_ENUM(CppType, "LuaName") - For enum types
LUNA_VAL(CppType, "LuaName") - For value types
LUNA_PTR_VAL(CppType, "LuaName") - For pointer types
Testing
After adding bindings:
cmake --build --preset linux-full --target cataclysm-bn-tiles
local my_id = MyTypeId.new("some_id")
print(my_id:str())
print(my_id:is_valid())
Common Issues
- Linker errors: Make sure the type header is included
- Missing comparison operators: Some types need
operator== and operator<
- Build errors: Check macro syntax and semicolons
Files to Modify
src/catalua_luna_doc.h - Add LUNA_* macro
src/catalua_bindings_ids.cpp - For ID types
src/catalua_bindings_*.cpp - For other types (choose appropriate file)
References
- Lua Integration Docs:
docs/en/mod/lua/explanation/lua_integration.md
- Existing Examples:
src/catalua_bindings_ids.cpp
- Luna System:
src/catalua_luna.h