Chạy script Lua, gọi hàm qua lại giữa C++ và Lua, script gắn trên entity, hot reload. Tiếp...
Classes | |
| struct | njin::script_desc |
| Tùy chọn của máy Lua, cho script_init(). Tiếp... | |
| struct | njin::script_result |
| Kết quả của script_call(). Tiếp... | |
Typedefs | |
| using | njin::script_value = std::variant<std::monostate, bool, f64, std::string, vec2, vec3, entt::entity> |
| Một giá trị đi qua lại giữa C++ và Lua: nil, bool, số, chuỗi, vec2, vec3 hay entity. | |
| using | njin::script_fn = std::function<script_value(context &, std::span<const script_value>)> |
| Hàm của game gọi được từ Lua, dạng chung: nhận mọi tham số, trả một giá trị. | |
Các hàm | |
| void | njin::script_init (context &ctx, const script_desc &desc={}) |
| Tạo máy Lua với tùy chọn desc. | |
| bool | njin::script_run_file (context &ctx, const char *path) |
| Chạy một file Lua (đường dẫn như mọi tài nguyên: cạnh file chạy hay thư mục làm việc). | |
| bool | njin::script_run_string (context &ctx, const char *code, const char *name="string") |
| Chạy một đoạn mã Lua. | |
| script_result | njin::script_call (context &ctx, const char *function, std::initializer_list< script_value > args={}) |
| Gọi một hàm Lua toàn cục theo tên. | |
| script_result | njin::script_call (context &ctx, const char *function, std::span< const script_value > args) |
| Như bản trên, với tham số trong một mảng. | |
| void | njin::script_register (context &ctx, const char *name, script_fn fn) |
| Đăng ký một hàm C++ dưới tên name (toàn cục bên Lua; có dấu chấm thì đặt trong bảng, tạo bảng khi cần). | |
| template<class F> requires (!std::is_convertible_v<F, script_fn>) | |
| void | njin::script_register (context &ctx, const char *name, F &&fn) |
| Đăng ký một hàm C++ với tham số và kiểu trả về thường: bool, số, std::string, vec2, vec3, entt::entity hay script_value, có thể nhận context & ở đầu. | |
| void | njin::script_set_global (context &ctx, const char *name, const script_value &value) |
| Đặt một biến toàn cục bên Lua (tên có dấu chấm đặt trong bảng). | |
| script_value | njin::script_get_global (context &ctx, const char *name) |
| Đọc một biến toàn cục bên Lua. | |
| bool | njin::script_attach (context &ctx, entt::entity entity, const char *path) |
| Gắn một script vào entity. | |
| void | njin::script_detach (context &ctx, entt::entity entity) |
| Gỡ script khỏi entity (gọi on_destroy). | |
| bool | njin::script_attached (const context &ctx, entt::entity entity) |
| Entity có script không. | |
| script_value | njin::script_field (context &ctx, entt::entity entity, const char *key) |
| Đọc trường key của bảng self của script gắn trên entity. | |
| void | njin::script_set_field (context &ctx, entt::entity entity, const char *key, const script_value &value) |
| Ghi trường key của bảng self. | |
| i32 | njin::script_count (const context &ctx) |
| Số entity đang có script. | |
| void | njin::script_set_save_id (context &ctx, entt::entity entity, const char *id) |
| Đặt tên lưu (self.save_id) cho script gắn trên entity: khóa để script_load_state() tìm lại đúng entity khi nạp game, vì entity tạo lại có số khác. | |
| std::string | njin::script_save_id (context &ctx, entt::entity entity) |
| Tên lưu của script gắn trên entity. | |
| json_value | njin::script_save_state (context &ctx) |
| Trạng thái của mọi script có tên lưu, để ghi vào save game: các trường của self (số, bool, chuỗi, vec2, vec3 và bảng lồng nhau của chúng), theo tên lưu, kèm file script. | |
| i32 | njin::script_load_state (context &ctx, const json_value &state) |
| Đổ trạng thái đã lưu bằng script_save_state() vào các script đang gắn có cùng tên lưu, rồi gọi on_load(self) của chúng. | |
Chạy script Lua, gọi hàm qua lại giữa C++ và Lua, script gắn trên entity, hot reload.
| using njin::script_value = std::variant<std::monostate, bool, f64, std::string, vec2, vec3, entt::entity> |
| void njin::script_init | ( | context & | ctx, |
| const script_desc & | desc = {} ) |
Tạo máy Lua với tùy chọn desc.
Không bắt buộc: lần dùng đầu của mọi hàm script_* tự tạo máy với tùy chọn mặc định. Gọi lần hai thì bỏ qua (máy đã có).
| ctx | Context của engine. |
| desc | Tùy chọn. |
| bool njin::script_run_file | ( | context & | ctx, |
| const char * | path ) |
Chạy một file Lua (đường dẫn như mọi tài nguyên: cạnh file chạy hay thư mục làm việc).
Hàm và biến toàn cục nó tạo dùng được bằng script_call() và script_get_global(). Lỗi (cú pháp hay lúc chạy) được ghi log kèm file và dòng, không làm game dừng.
| ctx | Context của engine. |
| path | File .lua. |
| bool njin::script_run_string | ( | context & | ctx, |
| const char * | code, | ||
| const char * | name = "string" ) |
Chạy một đoạn mã Lua.
Như script_run_file().
| ctx | Context của engine. |
| code | Mã Lua. |
| name | Tên hiện trong thông báo lỗi. |
| script_result njin::script_call | ( | context & | ctx, |
| const char * | function, | ||
| std::initializer_list< script_value > | args = {} ) |
Gọi một hàm Lua toàn cục theo tên.
Tên có dấu chấm ("enemy.spawn") tìm trong bảng. Không có hàm hay hàm lỗi thì ghi log và ok là false.
| ctx | Context của engine. |
| function | Tên hàm. |
| args | Tham số. |
| script_result njin::script_call | ( | context & | ctx, |
| const char * | function, | ||
| std::span< const script_value > | args ) |
Như bản trên, với tham số trong một mảng.
| ctx | Context của engine. |
| function | Tên hàm. |
| args | Tham số. |
| void njin::script_register | ( | context & | ctx, |
| const char * | name, | ||
| script_fn | fn ) |
Đăng ký một hàm C++ dưới tên name (toàn cục bên Lua; có dấu chấm thì đặt trong bảng, tạo bảng khi cần).
Lỗi C++ ném ra trong hàm thành lỗi Lua có file và dòng của chỗ gọi.
| ctx | Context của engine. |
| name | Tên bên Lua. |
| fn | Hàm. |
| void njin::script_register | ( | context & | ctx, |
| const char * | name, | ||
| F && | fn ) |
Đăng ký một hàm C++ với tham số và kiểu trả về thường: bool, số, std::string, vec2, vec3, entt::entity hay script_value, có thể nhận context & ở đầu.
Tham số Lua thiếu hay sai kiểu thành giá trị mặc định của kiểu đó.
| ctx | Context của engine. |
| name | Tên bên Lua. |
| fn | Hàm, lambda hay con trỏ hàm (không phải lambda generic). |
| void njin::script_set_global | ( | context & | ctx, |
| const char * | name, | ||
| const script_value & | value ) |
Đặt một biến toàn cục bên Lua (tên có dấu chấm đặt trong bảng).
| ctx | Context của engine. |
| name | Tên. |
| value | Giá trị. |
| script_value njin::script_get_global | ( | context & | ctx, |
| const char * | name ) |
Đọc một biến toàn cục bên Lua.
Bảng, hàm và giá trị không đổi được thì là nil.
| ctx | Context của engine. |
| name | Tên (có dấu chấm thì tìm trong bảng). |
| bool njin::script_attach | ( | context & | ctx, |
| entt::entity | entity, | ||
| const char * | path ) |
Gắn một script vào entity.
File phải trả về một bảng (như một lớp); mỗi entity có một bảng self riêng mà các hàm của bảng đó nhận làm tham số đầu:
self.entity là entity. Mọi trường game ghi vào self được giữ qua hot reload: file nạp lại chỉ thay các hàm. Nhiều entity dùng chung một file thì file chỉ nạp một lần. Gắn lần hai thì script cũ được gỡ trước (có on_destroy).
| ctx | Context của engine. |
| entity | Entity. |
| path | File .lua. |
| void njin::script_detach | ( | context & | ctx, |
| entt::entity | entity ) |
Gỡ script khỏi entity (gọi on_destroy).
Không có script thì bỏ qua.
| ctx | Context của engine. |
| entity | Entity. |
| bool njin::script_attached | ( | const context & | ctx, |
| entt::entity | entity ) |
Entity có script không.
| ctx | Context của engine. |
| entity | Entity. |
| script_value njin::script_field | ( | context & | ctx, |
| entt::entity | entity, | ||
| const char * | key ) |
Đọc trường key của bảng self của script gắn trên entity.
| ctx | Context của engine. |
| entity | Entity. |
| key | Tên trường. |
| void njin::script_set_field | ( | context & | ctx, |
| entt::entity | entity, | ||
| const char * | key, | ||
| const script_value & | value ) |
Ghi trường key của bảng self.
Không có script thì bỏ qua.
| ctx | Context của engine. |
| entity | Entity. |
| key | Tên trường. |
| value | Giá trị. |
| i32 njin::script_count | ( | const context & | ctx | ) |
Số entity đang có script.
| ctx | Context của engine. |
| void njin::script_set_save_id | ( | context & | ctx, |
| entt::entity | entity, | ||
| const char * | id ) |
Đặt tên lưu (self.save_id) cho script gắn trên entity: khóa để script_load_state() tìm lại đúng entity khi nạp game, vì entity tạo lại có số khác.
Script tự đặt được bằng self.save_id = "cua_kho". Tên phải khác nhau giữa các entity được lưu; nullptr hay chuỗi rỗng là bỏ tên (không lưu).
| ctx | Context của engine. |
| entity | Entity có script. |
| id | Tên lưu. |
| std::string njin::script_save_id | ( | context & | ctx, |
| entt::entity | entity ) |
Tên lưu của script gắn trên entity.
| ctx | Context của engine. |
| entity | Entity. |
| json_value njin::script_save_state | ( | context & | ctx | ) |
Trạng thái của mọi script có tên lưu, để ghi vào save game: các trường của self (số, bool, chuỗi, vec2, vec3 và bảng lồng nhau của chúng), theo tên lưu, kèm file script.
self.entity không được lưu (gắn lại sẽ có). Hàm, userdata khác, vòng tham chiếu, số không hữu hạn và khóa không phải chuỗi hay số nguyên bị bỏ, mỗi chỗ một cảnh báo kèm đường dẫn (cua_kho.self.inventory[3]). Hai trường cùng trỏ tới một bảng thành hai bản sao. Số entity trong self được lưu như số thường, không đổi theo entity mới.
| ctx | Context của engine. |
| i32 njin::script_load_state | ( | context & | ctx, |
| const json_value & | state ) |
Đổ trạng thái đã lưu bằng script_save_state() vào các script đang gắn có cùng tên lưu, rồi gọi on_load(self) của chúng.
Gọi sau khi đã tạo lại entity, gắn script và đặt tên lưu. Các trường đã lưu ghi đè trường cùng tên; trường không có trong bản lưu giữ nguyên. on_start của script vừa gắn vẫn chạy ở lần cập nhật đầu (sau on_load), nên đặt giá trị mặc định trong bảng của file (M.hp = 10) hay bằng self.hp = self.hp or 10 để không đè lên dữ liệu vừa nạp.
| ctx | Context của engine. |
| state | Giá trị script_save_state() trả về (đã qua json_save()/json_load()). |