Réecriture des types lua custom + fixs divers

This commit is contained in:
attilavs2 2025-05-19 21:05:29 +02:00
parent ab44eac4ee
commit 105095efbc
3 changed files with 155 additions and 76 deletions

View file

@ -82,7 +82,8 @@ Texture2D mkmap_tex(Map *map){
Rectangle rectb = recta;
rectb.x = x*32;
rectb.y = y*32;
ImageDraw(&mapimg, tile_index[tiles[map->width*y + x]], recta, rectb, WHITE);
ImageDraw(&mapimg, tile_index[tiles[map->width*y + x]], recta, rectb,
WHITE);
}
}
Texture2D maptex = LoadTextureFromImage(mapimg);

View file

@ -13,6 +13,69 @@
Game *gl_game;
typedef void (lua_affect_t)(lua_State*, void *, int);
struct LuaAffect {
lua_affect_t *func;
int arg;
};
struct TypeMap {
char *type_name;
int n_fields;
char **field_names;
struct LuaAffect field_affect[];
};
void lua_index_custom(lua_State *L, struct TypeMap *map){
void **ptr = luaL_checkudata(L, 1, map->type_name);
const char *name = luaL_checkstring(L, 2);
for(int i = 0; i < map->n_fields; i++){
if(!strcmp(name,map->field_names[i])){
map->field_affect[i].func(L, *((char**)(ptr)), map->field_affect[i].arg);
return;
}
}
char tbuf[256];
snprintf(tbuf, 256, "Invalid index for %s", map->type_name);
luaL_error(L, tbuf);
}
void lua_index_u8(lua_State *L, void *base, int offset){
uint8_t *ptr = (void*)(((char*)base) + offset);
lua_pushinteger(L, *ptr);
}
void lua_index_u16(lua_State *L, void *base, int offset){
uint16_t *ptr = (void*)(((char*)base) + offset);
lua_pushinteger(L, *ptr);
}
void lua_index_i32(lua_State *L, void *base, int offset){
int32_t *ptr = (void*)(((char*)base) + offset);
lua_pushinteger(L, *ptr);
}
void lua_newindex_u8(lua_State *L, void *base, int offset){
uint8_t *ptr = (void*)(((char*)base) + offset);
*ptr = luaL_checkinteger(L, 3);
}
void lua_newindex_u16(lua_State *L, void *base, int offset){
uint16_t *ptr = (void*)(((char*)base) + offset);
*ptr = luaL_checkinteger(L, 3);
}
void lua_newindex_i32(lua_State *L, void *base, int offset){
uint16_t *ptr = (void*)(((char*)base) + offset);
*ptr = luaL_checkinteger(L, 3);
}
static int lua_V2d_index(lua_State *L){
V2d **ptr = luaL_checkudata(L, 1, "V2d");
V2d *u = *ptr;
@ -69,90 +132,102 @@ static int lua_storage_newindex(lua_State *L){
uint8_t *storage = *ptr;
int pos = luaL_checkinteger(L, 2);
int val = luaL_checkinteger(L, 3);
if(pos >= 0 && pos < 5){
if(pos >= 0 && pos < 5)
storage[pos] = val;
}
else
return luaL_error(L, "Invalid index for Storage");
return 0;
}
void lua_machine_pos_index(lua_State *L, void *mach_, int offset){
(void)offset;
Machine *mach = mach_;
V2d **ptr = lua_newuserdatauv(L, sizeof(void*), 0);
*ptr = &mach->pos;
luaL_newmetatable(L, "V2d");
lua_setmetatable(L, -2);
}
void lua_machine_pos_newindex(lua_State *L, void *mach_, int offset){
(void)offset;
Machine *mach = mach_;
V2d **ptr = luaL_checkudata(L, 3, "V2d");
memmove(&mach->pos, *ptr, sizeof(V2d));
}
void lua_machine_storage_index(lua_State *L, void *mach_, int offset){
(void)offset;
Machine *mach = mach_;
uint8_t **ptr = lua_newuserdatauv(L, sizeof(void*), 0);
*ptr = mach->storage;
luaL_newmetatable(L, "Storage");
lua_setmetatable(L, -2);
}
#define OFFSET(field) (size_t)((char*)(BASE.field)-(char*)(BASE))
Machine bmach;
#define BASE &bmach
char *mach_index_names[] = {
"pos",
"type",
"assign_workers",
"active",
"storage",
"id"
};
struct TypeMap machine_index_map = {
.type_name = "Machine",
.n_fields = 6,
.field_names = mach_index_names,
.field_affect = {
{lua_machine_pos_index, 0},
{lua_index_u8, OFFSET(type)},
{lua_index_u8, OFFSET(assign_workers)},
{lua_index_u8, OFFSET(active)},
{lua_machine_storage_index, 0},
{lua_index_u16, OFFSET(id)}
}
};
struct TypeMap machine_newindex_map = {
.type_name = "Machine",
.n_fields = 6,
.field_names = mach_index_names,
.field_affect = {
{lua_machine_pos_newindex, 0},
{lua_newindex_u8, OFFSET(type)},
{lua_newindex_u8, OFFSET(assign_workers)},
{lua_newindex_u8, OFFSET(active)},
{NULL, 0}, // Shouldn't happen - TODO : Fix when it happens
{lua_newindex_u16, OFFSET(id)}
}
};
#undef BASE
#undef OFFSET
static int lua_machine_index(lua_State *L){
void **ptr = luaL_checkudata(L, 1, "Machine");
Machine *mach = *ptr;
const char *name = luaL_checkstring(L, 2);
int ret;
if(!strcmp(name, "pos")){
V2d **ptr = lua_newuserdatauv(L, sizeof(void*), 0);
*ptr = &mach->pos;
luaL_newmetatable(L, "V2d");
lua_setmetatable(L, -2);
return 1;
}
else if(!strcmp(name, "type")){
ret = mach->type;
}
else if(!strcmp(name, "assign_workers")){
ret = mach->assign_workers;
}
else if(!strcmp(name, "active")){
ret = mach->active;
}
else if(!strcmp(name, "storage")){
uint8_t **ptr = lua_newuserdatauv(L, sizeof(void*), 0);
*ptr = mach->storage;
luaL_newmetatable(L, "Storage");
lua_setmetatable(L, -2);
return 1;
}
else if(!strcmp(name, "id")){
ret = mach->id;
}
else {
return luaL_error(L, "Invalid index for Machine");
}
lua_pushinteger(L, ret);
lua_index_custom(L, &machine_index_map);
return 1;
}
static int lua_machine_newindex(lua_State *L){
void **ptr = luaL_checkudata(L, 1, "Machine");
Machine *mach = *ptr;
const char *name = luaL_checkstring(L, 2);
int prm;
V2d *pos = NULL;
if(lua_isinteger(L, -1))
prm = luaL_checkinteger(L, 3);
else{
V2d **ptr = luaL_checkudata(L, 3, "V2d");
pos = *ptr;
}
if(!strcmp(name, "pos") && pos){
memmove(&mach->pos, pos, sizeof(V2d));
return 1;
}
else if(!strcmp(name, "type")){
mach->type = prm;
}
else if(!strcmp(name, "assign_workers")){
mach->assign_workers = prm;
}
else if(!strcmp(name, "active")){
mach->active = prm;
}
else if(!strcmp(name, "id")){
mach->id = prm;
}
else {
return luaL_error(L, "Invalid index for Machine");
}
lua_index_custom(L, &machine_newindex_map);
return 0;
}
static int lua_worker_index(lua_State *L){
(void)L;
return 1;
}
// add_machine(x, y)
static int lua_add_machine(lua_State *L){
int x = luaL_checkinteger(L, 1);
@ -282,7 +357,7 @@ void lua_onmapload(Game *game, int map){
}
void lua_mt_init(lua_State *L){
for(int i = 0; i < sizeof(exported_funcs)/sizeof(*exported_funcs); i++)
for(size_t i = 0; i < sizeof(exported_funcs)/sizeof(*exported_funcs); i++)
lua_register(L, exported_funcs[i].name, exported_funcs[i].fn);
luaL_newmetatable(L, "Machine");
@ -308,7 +383,7 @@ void script_init(Game *game){
char tmpbuf[4096];
gl_game = game;
char *cwd = GetApplicationDirectory();
const char *cwd = GetApplicationDirectory();
snprintf(tmpbuf, 4096, "%sscript", cwd);
FilePathList scripts = LoadDirectoryFilesEx(tmpbuf,".lua",true);
@ -318,7 +393,7 @@ void script_init(Game *game){
puts("Fail 318");
return;
}
for(int i = 0; i < scripts.count; i++){
for(uint i = 0; i < scripts.count; i++){
lstates[i] = luaL_newstate();
lua_mt_init(lstates[i]);

View file

@ -263,9 +263,12 @@ void init_ui(){
// Android exclusive key -> no exit key
SetExitKey(KEY_MENU);
gui_info = (GUIInfo){{&game_widget, &main_menu, &worker_widget, &machine_widget, &pause_menu},
{false, true, false, false, false},
NULL};
gui_info = (GUIInfo){
{&game_widget, &main_menu, &worker_widget, &machine_widget, &pause_menu},
{false, true, false, false, false},
NULL,
NULL
};
}
void draw_widgets(Game *game){