Fin de refactor lua_inter - add_worker et Worker en lua

This commit is contained in:
attilavs2 2025-05-20 13:31:16 +02:00
parent 105095efbc
commit ac266206bc
3 changed files with 183 additions and 45 deletions

View file

@ -9,6 +9,10 @@ machine.pos = pos
mtprint(pos.x)
machine.pos.x = 50
machine.storage[0] = 1
worker = add_worker(30, 10)
mtprint(worker.name)
worker.pos.x = 25
mtprint(worker.pos.x)
function on_tick(game)
-- Ceci va drainer la sortie de la machine 2

View file

@ -42,7 +42,7 @@ void lua_index_custom(lua_State *L, struct TypeMap *map){
}
}
char tbuf[256];
snprintf(tbuf, 256, "Invalid index for %s", map->type_name);
snprintf(tbuf, 256, "Invalid index for %s : \"%s\"", map->type_name, name);
luaL_error(L, tbuf);
}
@ -61,6 +61,15 @@ void lua_index_i32(lua_State *L, void *base, int offset){
lua_pushinteger(L, *ptr);
}
// Index a V2d member of a struct != adressing into a V2d
void lua_index_V2d(lua_State *L, void *base, int offset){
V2d *ptr0 = (void*)(((char*)base) + offset);
V2d **ptr1 = lua_newuserdatauv(L, sizeof(void*), 0);
*ptr1 = ptr0;
luaL_newmetatable(L, "V2d");
lua_setmetatable(L, -2);
}
void lua_newindex_u8(lua_State *L, void *base, int offset){
uint8_t *ptr = (void*)(((char*)base) + offset);
*ptr = luaL_checkinteger(L, 3);
@ -76,6 +85,13 @@ void lua_newindex_i32(lua_State *L, void *base, int offset){
*ptr = luaL_checkinteger(L, 3);
}
// newindex a V2d member of a struct != adressing into a V2d
void lua_newindex_V2d(lua_State *L, void *base, int offset){
V2d *dst = (void*)(((char*)base) + offset);
V2d **ptr = luaL_checkudata(L, 3, "V2d");
memmove(dst, *ptr, sizeof(V2d));
}
static int lua_V2d_index(lua_State *L){
V2d **ptr = luaL_checkudata(L, 1, "V2d");
V2d *u = *ptr;
@ -83,11 +99,11 @@ static int lua_V2d_index(lua_State *L){
if(name[1] != '\0')
return luaL_error(L, "Invalid index for V2d");
if(name[0] == 'x'){
lua_pushinteger(L, u->x);
lua_pushnumber(L, u->x);
return 1;
}
else if(name[0] == 'y'){
lua_pushinteger(L, u->y);
lua_pushnumber(L, u->y);
return 1;
}
else {
@ -99,7 +115,7 @@ static int lua_V2d_newindex(lua_State *L){
V2d **ptr = luaL_checkudata(L, 1, "V2d");
V2d *u = *ptr;
const char *name = luaL_checkstring(L, 2);
float val = luaL_checknumber(L, 3);
lua_Number val = luaL_checknumber(L, 3);
if(name[1] != '\0')
return luaL_error(L, "Invalid index for V2d");
if(name[0] == 'x'){
@ -140,22 +156,6 @@ static int lua_storage_newindex(lua_State *L){
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_;
@ -165,6 +165,22 @@ void lua_machine_storage_index(lua_State *L, void *mach_, int offset){
lua_setmetatable(L, -2);
}
void lua_worker_aiint_index(lua_State *L, void *work_, int offset){
(void)offset;
Worker *work = work_;
AiInternal **ptr = lua_newuserdatauv(L, sizeof(void*), 0);
*ptr = &work->ai;
luaL_newmetatable(L, "AiInternal");
lua_setmetatable(L, -2);
}
void lua_worker_aiint_newindex(lua_State *L, void *work_, int offset){
(void)offset;
Worker *work = work_;
AiInternal **src = luaL_checkudata(L, 3, "AiInternal");
memmove(&work->ai, *src, sizeof(AiInternal));
}
#define OFFSET(field) (size_t)((char*)(BASE.field)-(char*)(BASE))
Machine bmach;
@ -185,7 +201,7 @@ struct TypeMap machine_index_map = {
.n_fields = 6,
.field_names = mach_index_names,
.field_affect = {
{lua_machine_pos_index, 0},
{lua_index_V2d, OFFSET(pos)},
{lua_index_u8, OFFSET(type)},
{lua_index_u8, OFFSET(assign_workers)},
{lua_index_u8, OFFSET(active)},
@ -199,7 +215,7 @@ struct TypeMap machine_newindex_map = {
.n_fields = 6,
.field_names = mach_index_names,
.field_affect = {
{lua_machine_pos_newindex, 0},
{lua_newindex_V2d, OFFSET(pos)},
{lua_newindex_u8, OFFSET(type)},
{lua_newindex_u8, OFFSET(assign_workers)},
{lua_newindex_u8, OFFSET(active)},
@ -210,6 +226,100 @@ struct TypeMap machine_newindex_map = {
#undef BASE
AiInternal baiint;
#define BASE &baiint
char *aiint_index_names[] = {
"status",
"carrying",
"carry_type",
"mtype",
"assigned_machine",
"assigned_machine1",
"dest"
};
struct TypeMap aiint_index_map = {
.type_name = "AiInternal",
.n_fields = 7,
.field_names = aiint_index_names,
.field_affect = {
{lua_index_u8, OFFSET(status)},
{lua_index_u8, OFFSET(carrying)},
{lua_index_u8, OFFSET(carry_type)},
{lua_index_u8, OFFSET(mtype)},
{lua_index_u16, OFFSET(assigned_machine)},
{lua_index_u16, OFFSET(assigned_machine1)},
{lua_index_V2d, OFFSET(dest)}
}
};
struct TypeMap aiint_newindex_map = {
.type_name = "AiInternal",
.n_fields = 7,
.field_names = aiint_index_names,
.field_affect = {
{lua_newindex_u8, OFFSET(status)},
{lua_newindex_u8, OFFSET(carrying)},
{lua_newindex_u8, OFFSET(carry_type)},
{lua_newindex_u8, OFFSET(mtype)},
{lua_newindex_u16, OFFSET(assigned_machine)},
{lua_newindex_u16, OFFSET(assigned_machine1)},
{lua_newindex_V2d, OFFSET(dest)}
}
};
#undef BASE
Worker bwork;
#define BASE &bwork
char *work_index_names[] = {
"pos",
"ai",
"traits",
"anim_frame",
"assign_n",
"satisf",
"fatigue",
"name"
};
struct TypeMap worker_index_map = {
.type_name = "Worker",
.n_fields = 8,
.field_names = work_index_names,
.field_affect = {
{lua_index_V2d, OFFSET(pos)},
{lua_worker_aiint_index, 0},
{lua_index_u16, OFFSET(traits)},
{lua_index_u8, OFFSET(anim_frame)},
{lua_index_u8, OFFSET(assign_n)},
{lua_index_u8, OFFSET(satisf)},
{lua_index_u8, OFFSET(fatigue)},
{lua_index_u8, OFFSET(name)}
}
};
struct TypeMap worker_newindex_map = {
.type_name = "Worker",
.n_fields = 8,
.field_names = work_index_names,
.field_affect = {
{lua_newindex_V2d, OFFSET(pos)},
{lua_worker_aiint_newindex, 0},
{lua_newindex_u16, OFFSET(traits)},
{lua_newindex_u8, OFFSET(anim_frame)},
{lua_newindex_u8, OFFSET(assign_n)},
{lua_newindex_u8, OFFSET(satisf)},
{lua_newindex_u8, OFFSET(fatigue)},
{lua_newindex_u8, OFFSET(name)}
}
};
#undef BASE
#undef OFFSET
@ -223,15 +333,30 @@ static int lua_machine_newindex(lua_State *L){
return 0;
}
static int lua_aiint_index(lua_State *L){
lua_index_custom(L, &aiint_index_map);
return 1;
}
static int lua_aiint_newindex(lua_State *L){
lua_index_custom(L, &aiint_newindex_map);
return 1;
}
static int lua_worker_index(lua_State *L){
(void)L;
lua_index_custom(L, &worker_index_map);
return 1;
}
static int lua_worker_newindex(lua_State *L){
lua_index_custom(L, &worker_newindex_map);
return 1;
}
// add_machine(x, y)
static int lua_add_machine(lua_State *L){
int x = luaL_checkinteger(L, 1);
int y = luaL_checkinteger(L, 2);
lua_Number x = luaL_checknumber(L, 1);
lua_Number y = luaL_checknumber(L, 2);
Machine **buf = lua_newuserdatauv(L, sizeof(void*), 0);
*buf = add_machine(&gl_game->machines, (V2d){.x=x,.y=y});
@ -258,6 +383,19 @@ static int lua_get_machine_from_id(lua_State *L){
return 1;
}
// add_worker(x, y)
static int lua_add_worker(lua_State *L){
lua_Number x = luaL_checknumber(L, 1);
lua_Number y = luaL_checknumber(L, 2);
Worker *work = add_worker(&gl_game->workers, (V2d){.x=x,.y=y});
if(!work)
return luaL_error(L, "(lua) Failed to add a worker");
Worker **buf = lua_newuserdatauv(L, sizeof(void*), 0);
*buf = work;
luaL_newmetatable(L, "Worker");
lua_setmetatable(L, -2);
}
// mtprint(str)
static int lua_mtprint(lua_State *L){
printf("(lua) %s\n", luaL_checkstring(L, 1));
@ -274,6 +412,7 @@ struct LuaFn exported_funcs[] = {
{"mtprint", lua_mtprint},
{"add_machine", lua_add_machine},
{"get_machine_from_id", lua_get_machine_from_id},
{"add_worker", lua_add_worker},
};
int lstate_n;
@ -356,27 +495,22 @@ void lua_onmapload(Game *game, int map){
}
}
#define ADD_TYPE(name, index, newindex) \
luaL_newmetatable(L, (name)); \
lua_pushcfunction(L, (index)); \
lua_setfield(L, -2, "__index"); \
lua_pushcfunction(L, (newindex)); \
lua_setfield(L, -2, "__newindex")
void lua_mt_init(lua_State *L){
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");
lua_pushcfunction(L, lua_machine_index);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lua_machine_newindex);
lua_setfield(L, -2, "__newindex");
luaL_newmetatable(L, "V2d");
lua_pushcfunction(L, lua_V2d_index);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lua_V2d_newindex);
lua_setfield(L, -2, "__newindex");
luaL_newmetatable(L, "Storage");
lua_pushcfunction(L, lua_storage_index);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lua_storage_newindex);
lua_setfield(L, -2, "__newindex");
ADD_TYPE("Machine", lua_machine_index, lua_machine_newindex);
ADD_TYPE("V2d", lua_V2d_index, lua_V2d_newindex);
ADD_TYPE("Storage", lua_storage_index, lua_storage_newindex);
ADD_TYPE("AiInternal", lua_aiint_index, lua_aiint_newindex);
ADD_TYPE("Worker", lua_worker_index, lua_worker_newindex);
}
void script_init(Game *game){

View file

@ -57,11 +57,11 @@ typedef struct {
AiInternal ai;
uint16_t traits;
uint8_t anim_frame;
uint assign_n : 2; // To offset on machines
uint satisf : 6;
uint8_t assign_n; // To offset on machines
uint8_t satisf;
uint8_t fatigue;
uint8_t name;
uint8_t __padding[2];
uint8_t __padding[1];
} Worker;