Files
mini/lua.cpp
Raimon Zamora 5306e82897 - Adaptat exemple a la nova API
- [NEW] viewport.resetClipping()
2025-02-19 06:49:56 +01:00

1183 lines
43 KiB
C++

#include "lua.h"
#include "lua/lua.hpp"
#include "mini.h"
#include "jfile.h"
#include <filesystem>
namespace fs = std::filesystem;
extern "C" {
// surface
// ===============================================
static int cpp_surf_new(lua_State *L) {
int w = luaL_checknumber(L, 1);
int h = luaL_checknumber(L, 2);
lua_pushinteger(L, newsurf(w, h));
return 1;
}
static int cpp_surf_load(lua_State *L) {
const char* str = luaL_checkstring(L, 1);
lua_pushinteger(L, loadsurf(str));
return 1;
}
static int cpp_surf_save(lua_State *L) {
uint8_t surface = luaL_checkinteger(L, 1);
const char* str = luaL_checkstring(L, 2);
if (lua_istable(L, -1)) {
const int len = SDL_min(256, lua_rawlen(L, -1));
uint8_t *pal = (uint8_t*)malloc(len*3);
uint8_t *p=pal;
for (int i=1;i<=len;++i) {
lua_rawgeti(L, -1, i);
lua_getfield(L, -1, "r");
*(p++) = luaL_checknumber(L, -1);
lua_pop(L, 1);
lua_getfield(L, -1, "g");
*(p++) = luaL_checknumber(L, -1);
lua_pop(L, 1);
lua_getfield(L, -1, "b");
*(p++) = luaL_checknumber(L, -1);
lua_pop(L, 1);
lua_pop(L, 1);
//pal[i-1] = (r<<16)+(g<<8)+b;
}
savesurf(surface, str, pal, len-1);
} else {
savesurf(surface, str, nullptr);
}
return 0;
}
static int cpp_surf_free(lua_State *L) {
uint8_t surface = luaL_checkinteger(L, 1);
freesurf(surface);
return 0;
}
static int cpp_surf_getSize(lua_State *L) {
uint8_t surface = luaL_checkinteger(L, 1);
lua_pushinteger(L, surfw(surface));
lua_pushinteger(L, surfh(surface));
return 2;
}
static int cpp_surf_setTarget(lua_State *L) {
const int numargs = lua_gettop(L);
switch (numargs) {
case 0: {
setdest(0);
return 0;
}
case 1: {
uint8_t surface = luaL_checkinteger(L, 1);
setdest(surface);
return 0;
}
default:
return luaL_error(L, "Function 'surface.setTarget' Unexpected number of parameters.");
};
}
static int cpp_surf_cls(lua_State *L) {
uint8_t color = luaL_optinteger(L, 1, 0);
cls(color);
return 0;
}
static int cpp_surf_setPixel(lua_State *L) {
const int numargs = lua_gettop(L);
switch (numargs) {
case 3: {
int x = luaL_checknumber(L, 1);
int y = luaL_checknumber(L, 2);
uint8_t color = luaL_checkinteger(L, 3);
pset(x, y, color);
return 0;
}
case 4: {
uint8_t surface = luaL_checkinteger(L, 1);
setsource(surface);
int x = luaL_checknumber(L, 2);
int y = luaL_checknumber(L, 3);
uint8_t color = luaL_checkinteger(L, 4);
sset(x, y, color);
return 0;
}
default:
return luaL_error(L, "Function 'surface.setPixel' Unexpected number of parameters.");
};
}
static int cpp_surf_getPixel(lua_State *L) {
const int numargs = lua_gettop(L);
switch (numargs) {
case 2: {
int x = luaL_checknumber(L, 1);
int y = luaL_checknumber(L, 2);
lua_pushinteger(L, pget(x, y));
return 1;
}
case 3: {
uint8_t surface = luaL_checkinteger(L, 1);
setsource(surface);
int x = luaL_checknumber(L, 2);
int y = luaL_checknumber(L, 3);
lua_pushinteger(L, sget(x, y));
return 1;
}
default:
return luaL_error(L, "Function 'surface.getPixel' Unexpected number of parameters.");
};
}
// map
// ===============================================
static int cpp_map_load(lua_State *L) {
const char* str = luaL_checkstring(L, 1);
setmap(loadsurf(str));
return 0;
}
static int cpp_map_save(lua_State *L) {
uint8_t surface = getmap();
const char* str = luaL_checkstring(L, 1);
savesurf(surface, str, nullptr);
return 0;
}
static int cpp_map_set(lua_State *L) {
uint8_t surface = luaL_checkinteger(L, 1);
setmap(surface);
return 0;
}
static int cpp_map_draw(lua_State *L) {
/*uint8_t celx = luaL_checknumber(L, 1);
uint8_t cely = luaL_checknumber(L, 2);
int sx = luaL_checknumber(L, 3);
int sy = luaL_checknumber(L, 4);
uint8_t celw = luaL_checknumber(L, 5);
uint8_t celh = luaL_checknumber(L, 6);
uint8_t layer = luaL_optinteger(L, 7, 0);*/
map(); //celx, cely, sx, sy, celw, celh, layer);
return 0;
}
static int cpp_map_getTile(lua_State *L) {
int celx = luaL_checknumber(L, 1);
int cely = luaL_checknumber(L, 2);
lua_pushinteger(L, mget(celx, cely));
return 1;
}
static int cpp_map_setTile(lua_State *L) {
int celx = luaL_checknumber(L, 1);
int cely = luaL_checknumber(L, 2);
uint8_t snum = luaL_checkinteger(L, 3);
mset(celx, cely, snum);
return 0;
}
// palette
// ===============================================
static int cpp_pal_load(lua_State *L) {
const char* str = luaL_checkstring(L, 1);
uint16_t size;
uint32_t *pal = loadpal(str, &size);
lua_createtable(L, 2, 0);
for (int i=0;i<size;++i) {
uint32_t color = pal[i];
lua_createtable(L, 0, 3);
lua_pushinteger(L, (color>>16)&0xff);
lua_setfield(L, -2, "r");
lua_pushinteger(L, (color>>8)&0xff);
lua_setfield(L, -2, "g");
lua_pushinteger(L, color&0xff);
lua_setfield(L, -2, "b");
lua_rawseti(L, -2, i+1);
}
free(pal);
return 1;
}
static int cpp_pal_set(lua_State *L) {
int r,g,b;
if (lua_istable(L, -1)) {
uint32_t pal[256];
const int len = SDL_min(256, lua_rawlen(L, -1));
for (int i=0;i<len;++i) {
lua_rawgeti(L, -1, i+1);
lua_getfield(L, -1, "r");
r = luaL_checknumber(L, -1);
lua_pop(L, 1);
lua_getfield(L, -1, "g");
g = luaL_checknumber(L, -1);
lua_pop(L, 1);
lua_getfield(L, -1, "b");
b = luaL_checknumber(L, -1);
lua_pop(L, 1);
lua_pop(L, 1);
pal[i] = (r<<16)+(g<<8)+b;
}
setpal(pal);
}
return 0;
}
static int cpp_pal_getColor(lua_State *L) {
if (lua_gettop(L) != 1) return luaL_error(L, "Function 'mini.palette.getColor' Unexpected number of parameters.");
uint8_t index = luaL_checkinteger(L, 1);
uint32_t color = getcolor(index);
lua_pushinteger(L, (color>>16)&0xff);
lua_pushinteger(L, (color>>8)&0xff);
lua_pushinteger(L, color&0xff);
return 3;
}
static int cpp_pal_setColor(lua_State *L) {
if (lua_gettop(L) != 4) return luaL_error(L, "Function 'mini.palette.setColor' Unexpected number of parameters.");
uint8_t index = luaL_checkinteger(L, 1);
uint8_t r = luaL_checkinteger(L, 2);
uint8_t g = luaL_optinteger(L, 3, 0);
uint8_t b = luaL_optinteger(L, 4, 0);
uint32_t color = (r<<16) + (g<<8) + b;
setcolor(index, color);
return 0;
}
static int cpp_pal_trans(lua_State *L) {
if (lua_gettop(L) == 0) {
lua_pushinteger(L, gettrans());
return 1;
} else {
uint8_t index = luaL_checkinteger(L, 1);
settrans(index);
return 0;
}
}
// subpalette
// ===============================================
static int cpp_subpalette_resetAll(lua_State *L) {
reset_subpal();
return 0;
}
static int cpp_subpalette_set(lua_State *L) {
uint8_t index, color;
index = luaL_checkinteger(L, 1);
color = luaL_checkinteger(L, 2);
subpal(index, color);
return 0;
}
static int cpp_subpalette_reset(lua_State *L) {
uint8_t index;
index = luaL_checkinteger(L, 1);
subpal(index,index);
return 0;
}
static int cpp_subpalette_setRange(lua_State *L) {
uint8_t index, index2, color;
index = luaL_checkinteger(L, 1);
index2 = luaL_checkinteger(L, 2);
color = luaL_checkinteger(L, 3);
for (int i=index;i<=index2;++i) subpal(i, color);
return 0;
}
static int cpp_subpalette_resetRange(lua_State *L) {
uint8_t index, index2;
index = luaL_checkinteger(L, 1);
index2 = luaL_checkinteger(L, 2);
for (int i=index;i<=index2;++i) subpal(i, i);
return 0;
}
// viewport
// ===============================================
static int cpp_viewport_resetClipping(lua_State *L) {
clip();
return 0;
}
static int cpp_viewport_setClipping(lua_State *L) {
int x = luaL_checknumber(L, 1);
int y = luaL_checknumber(L, 2);
int w = luaL_checknumber(L, 3);
int h = luaL_checknumber(L, 4);
clip(x, y, w, h);
return 0;
}
static int cpp_viewport_setOrigin(lua_State *L) {
int x = luaL_checknumber(L, 1);
int y = luaL_checknumber(L, 2);
origin(x, y);
return 0;
}
static int cpp_viewport_getOrigin(lua_State *L) {
lua_pushinteger(L, camx());
lua_pushinteger(L, camy());
return 2;
}
static int cpp_viewport_tolocal(lua_State *L) {
int x = luaL_checknumber(L, 1);
int y = luaL_checknumber(L, 2);
lua_pushinteger(L, x+camx());
lua_pushinteger(L, y+camy());
return 2;
}
// draw
// ===============================================
/*static int cpp_draw_pen(lua_State *L) {
uint8_t col = luaL_optinteger(L, 1, 6);
color(col);
return 0;
}
static int cpp_draw_paper(lua_State *L) {
uint8_t col = luaL_optinteger(L, 1, 6);
bcolor(col);
return 0;
}*/
static int cpp_draw_line(lua_State *L) {
int x0 = luaL_checknumber(L, 1);
int y0 = luaL_checknumber(L, 2);
int x1 = luaL_checknumber(L, 3);
int y1 = luaL_checknumber(L, 4);
uint8_t color = luaL_checkinteger(L, 5);
line(x0, y0, x1, y1, color);
return 0;
}
static int cpp_draw_hline(lua_State *L) {
int x0 = luaL_checknumber(L, 1);
int y = luaL_checknumber(L, 2);
int x1 = luaL_checknumber(L, 3);
uint8_t color = luaL_checkinteger(L, 4);
hline(x0, y, x1, color);
return 0;
}
static int cpp_draw_vline(lua_State *L) {
int x = luaL_checknumber(L, 1);
int y0 = luaL_checknumber(L, 2);
int y1 = luaL_checknumber(L, 3);
uint8_t color = luaL_checkinteger(L, 4);
vline(x, y0, y1, color);
return 0;
}
static int cpp_draw_rect(lua_State *L) {
int x0 = luaL_checknumber(L, 1);
int y0 = luaL_checknumber(L, 2);
int x1 = luaL_checknumber(L, 3);
int y1 = luaL_checknumber(L, 4);
uint8_t color = luaL_checkinteger(L, 5);
rect(x0, y0, x1, y1, color);
return 0;
}
static int cpp_draw_rectfill(lua_State *L) {
int x0 = luaL_checknumber(L, 1);
int y0 = luaL_checknumber(L, 2);
int x1 = luaL_checknumber(L, 3);
int y1 = luaL_checknumber(L, 4);
uint8_t color = luaL_checkinteger(L, 5);
rectfill(x0, y0, x1, y1, color);
return 0;
}
static int cpp_draw_circ(lua_State *L) {
int x = luaL_checknumber(L, 1);
int y = luaL_checknumber(L, 2);
int r = luaL_optnumber(L, 3, 4);
uint8_t color = luaL_checkinteger(L, 4);
circ(x, y, r, color);
return 0;
}
static int cpp_draw_circfill(lua_State *L) {
int x = luaL_checknumber(L, 1);
int y = luaL_checknumber(L, 2);
int r = luaL_optnumber(L, 3, 4);
uint8_t color = luaL_checkinteger(L, 4);
circfill(x, y, r, color);
return 0;
}
static int cpp_draw_oval(lua_State *L) {
int x0 = luaL_checknumber(L, 1);
int y0 = luaL_checknumber(L, 2);
int x1 = luaL_checknumber(L, 3);
int y1 = luaL_checknumber(L, 4);
uint8_t color = luaL_checkinteger(L, 5);
oval(x0, y0, x1, y1, color);
return 0;
}
static int cpp_draw_ovalfill(lua_State *L) {
int x0 = luaL_checknumber(L, 1);
int y0 = luaL_checknumber(L, 2);
int x1 = luaL_checknumber(L, 3);
int y1 = luaL_checknumber(L, 4);
uint8_t color = luaL_checkinteger(L, 5);
ovalfill(x0, y0, x1, y1, color);
return 0;
}
static int cpp_draw_pattern(lua_State *L) {
uint16_t pat = luaL_checkinteger(L, 1);
bool transparent = lua_toboolean(L, 2);
fillp(pat, transparent);
return 0;
}
/*static int cpp_draw_tline(lua_State *L) {
int x0 = luaL_checknumber(L, 1);
int y0 = luaL_checknumber(L, 2);
int x1 = luaL_checknumber(L, 3);
int y1 = luaL_checknumber(L, 4);
float mx = luaL_checknumber(L, 5);
float my = luaL_checknumber(L, 6);
float mdx = luaL_optnumber(L, 7, 0.125f);
float mdy = luaL_optnumber(L, 8, 0.0f);
tline(x0, y0, x1, y1, mx, my, mdx, mdy);
return 0;
}
static int cpp_draw_thline(lua_State *L) {
int x0 = luaL_checknumber(L, 1);
int y = luaL_checknumber(L, 2);
int x1 = luaL_checknumber(L, 3);
float mx = luaL_checknumber(L, 4);
float my = luaL_checknumber(L, 5);
float mdx = luaL_optnumber(L, 6, 0.125f);
float mdy = luaL_optnumber(L, 7, 0.0f);
thline(x0, y, x1, mx, my, mdx, mdy);
return 0;
}
static int cpp_draw_tvline(lua_State *L) {
int x = luaL_checknumber(L, 1);
int y0 = luaL_checknumber(L, 2);
int y1 = luaL_checknumber(L, 3);
float mx = luaL_checknumber(L, 4);
float my = luaL_checknumber(L, 5);
float mdx = luaL_optnumber(L, 6, 0.0f);
float mdy = luaL_optnumber(L, 7, 0.125f);
tvline(x, y0, y1, mx, my, mdx, mdy);
return 0;
}*/
static int cpp_draw_surface(lua_State *L) {
uint8_t surface = luaL_checkinteger(L, 1);
setsource(surface);
int sx = luaL_checknumber(L, 2);
int sy = luaL_checknumber(L, 3);
int sw = luaL_checknumber(L, 4);
int sh = luaL_checknumber(L, 5);
int dx = luaL_checknumber(L, 6);
int dy = luaL_checknumber(L, 7);
int dw = luaL_optnumber(L, 8, 0);
int dh = luaL_optnumber(L, 9, 0);
bool flip_x = lua_toboolean(L, 10);
bool flip_y = lua_toboolean(L, 11);
bool invert = lua_toboolean(L, 12);
blit(sx, sy, sw, sh, dx, dy, dw, dh, flip_x, flip_y, invert);
return 0;
}
static int cpp_draw_surfaceRotated(lua_State *L) {
uint8_t surface = luaL_checkinteger(L, 1);
setsource(surface);
int sx = luaL_checknumber(L, 2);
int sy = luaL_checknumber(L, 3);
int sw = luaL_checknumber(L, 4);
int sh = luaL_checknumber(L, 5);
int dx = luaL_checknumber(L, 6);
int dy = luaL_checknumber(L, 7);
float a = luaL_checknumber(L, 8);
blit_r(sx, sy, sw, sh, dx, dy, a);
return 0;
}
static int cpp_draw_text(lua_State *L) {
const char* str = luaL_checkstring(L, 1);
int x = luaL_checknumber(L, 2);
int y = luaL_checknumber(L, 3);
if (lua_gettop(L) > 3) {
uint8_t color = luaL_checkinteger(L, 4);
print(str, x, y, color);
} else {
print(str, x, y);
}
return 0;
}
// music
// ===============================================
static int cpp_music_play(lua_State *L) {
const char* str = luaL_checkstring(L, 1);
const int loop = luaL_optinteger(L, 2, -1);
playmusic(str, loop);
return 0;
}
static int cpp_music_pause(lua_State *L) {
pausemusic();
return 0;
}
static int cpp_music_resume(lua_State *L) {
resumemusic();
return 0;
}
static int cpp_music_stop(lua_State *L) {
const int time = luaL_optinteger(L, 1, 1000);
stopmusic(time);
return 0;
}
static int cpp_music_setPosition(lua_State *L) {
musicpos(luaL_checknumber(L, 1));
return 0;
}
static int cpp_music_getPosition(lua_State *L) {
lua_pushnumber(L, musicpos());
return 1;
}
// sound
// ===============================================
static int cpp_sound_load(lua_State *L) {
const char* str = luaL_checkstring(L, 1);
lua_pushinteger(L,loadsound(str));
return 1;
}
static int cpp_sound_free(lua_State *L) {
const int sound = luaL_checknumber(L, 1);
freesound(sound);
return 0;
}
static int cpp_sound_play(lua_State *L) {
const int sound = luaL_checknumber(L, 1);
const int volume = luaL_optinteger(L, 2, -1);
lua_pushinteger(L,playsound(sound, volume));
return 1;
}
static int cpp_sound_stop(lua_State *L) {
const int sound = luaL_checknumber(L, 1);
stopsound(sound);
return 0;
}
// sys
// ===============================================
static int cpp_sys_time(lua_State *L) {
lua_pushnumber(L, time());
return 1;
}
static int cpp_sys_setBeat(lua_State *L) {
int16_t beats = luaL_optnumber(L, 1, -1);
beat(beats);
return 0;
}
static int cpp_sys_isBeat(lua_State *L) {
lua_pushboolean(L, beat(-1));
return 1;
}
static int cpp_sys_updateFullSpeed(lua_State *L) {
setupdatemode(UPDATE_ALWAYS);
return 0;
}
static int cpp_sys_updateEvents(lua_State *L) {
setupdatemode(UPDATE_WAIT);
return 0;
}
static int cpp_sys_updateTimeout(lua_State *L) {
setupdatemode(UPDATE_TIMEOUT, luaL_checknumber(L, 1));
return 0;
}
static int cpp_sys_dir(lua_State *L) {
lua_newtable(L);
int i=1;
for (const auto& entry : fs::directory_iterator("./data")) {
lua_pushstring(L, entry.path().u8string().c_str());
lua_rawseti(L, -2, i++);
}
return 1;
}
static int cpp_sys_exit(lua_State *L) {
exit();
return 0;
}
// win
// ===============================================
static int cpp_win_getZoom(lua_State *L) {
lua_pushinteger(L, getzoom());
return 1;
}
static int cpp_win_setZoom(lua_State *L) {
const int value = luaL_optinteger(L, 1, 0);
setzoom(value);
return 0;
}
static int cpp_win_getFullscreen(lua_State *L) {
lua_pushboolean(L, getfullscreen());
return 1;
}
static int cpp_win_setFullscreen(lua_State *L) {
setfullscreen(lua_toboolean(L, 1));
return 0;
}
static int cpp_win_showCursor(lua_State *L) {
setcursor(lua_toboolean(L, 1));
return 0;
}
static int cpp_win_getResolution(lua_State *L) {
lua_pushinteger(L, scrw());
lua_pushinteger(L, scrh());
return 2;
}
static int cpp_win_setResolution(lua_State *L) {
const int w = luaL_optinteger(L, 1, 160);
const int h = luaL_optinteger(L, 2, 120);
setres(w, h);
return 0;
}
// conf
// ===============================================
static int cpp_conf_getKey(lua_State *L) {
const char* key = luaL_checkstring(L, 1);
const char* value = getconfig(key);
if (value==NULL) {
lua_pushnil(L);
} else {
lua_pushstring(L, value);
}
return 1;
}
static int cpp_conf_setKey(lua_State *L) {
const char* key = luaL_checkstring(L, 1);
const char* value = luaL_checkstring(L, 2);
setconfig(key, value);
return 0;
}
static int cpp_conf_folder(lua_State *L) {
lua_pushstring(L, configfolder());
return 1;
}
// mouse
// ===============================================
static int cpp_mouse_pos(lua_State *L) {
lua_pushinteger(L, mousex());
lua_pushinteger(L, mousey());
return 2;
}
static int cpp_mouse_wheel(lua_State *L) {
lua_pushinteger(L, mwheel());
return 1;
}
static int cpp_mouse_down(lua_State *L) {
uint8_t i = luaL_checkinteger(L, 1);
lua_pushboolean(L, mbtn(i));
return 1;
}
static int cpp_mouse_press(lua_State *L) {
uint8_t i = luaL_checkinteger(L, 1);
lua_pushboolean(L, mbtnp(i));
return 1;
}
// key
// ===============================================
static int cpp_key_down(lua_State *L) {
uint8_t i = luaL_checkinteger(L, 1);
lua_pushboolean(L, btn(i));
return 1;
}
static int cpp_key_press(lua_State *L) {
if (lua_gettop(L) >=1 ) {
uint8_t i = luaL_checkinteger(L, 1);
lua_pushboolean(L, btnp(i));
} else {
lua_pushinteger(L, wbtnp());
}
return 1;
}
static int cpp_key_any(lua_State *L) {
lua_pushboolean(L, anykey());
return 1;
}
// pad
// ===============================================
static int cpp_pad_down(lua_State *L) {
int8_t i = luaL_checkinteger(L, 1);
lua_pushboolean(L, pad(i));
return 1;
}
static int cpp_pad_press(lua_State *L) {
if (lua_gettop(L) >=1 ) {
int8_t i = luaL_checkinteger(L, 1);
lua_pushboolean(L, padp(i));
} else {
lua_pushinteger(L, wpad());
}
return 1;
}
static int cpp_pad_any(lua_State *L) {
lua_pushinteger(L, wpad());
return 1;
}
}
lua_State *L;
bool is_playing = false;
bool init_exists = false;
bool update_exists = false;
bool lua_is_playing() {
return is_playing;
}
void push_lua_funcs() {
lua_newtable(L);
lua_setglobal(L, "mini");
lua_newtable(L);
lua_pushcfunction(L,cpp_surf_new); lua_setfield(L, -2, "new");
lua_pushcfunction(L,cpp_surf_load); lua_setfield(L, -2, "load");
lua_pushcfunction(L,cpp_surf_save); lua_setfield(L, -2, "save");
lua_pushcfunction(L,cpp_surf_free); lua_setfield(L, -2, "free");
lua_pushcfunction(L,cpp_surf_getSize); lua_setfield(L, -2, "getSize");
lua_pushcfunction(L,cpp_surf_setTarget); lua_setfield(L, -2, "setTarget");
lua_pushcfunction(L,cpp_surf_cls); lua_setfield(L, -2, "cls");
lua_pushcfunction(L,cpp_surf_setPixel); lua_setfield(L, -2, "setPixel");
lua_pushcfunction(L,cpp_surf_getPixel); lua_setfield(L, -2, "getPixel");
lua_setglobal(L, "surface");
lua_newtable(L);
lua_pushcfunction(L,cpp_map_load); lua_setfield(L, -2, "load");
lua_pushcfunction(L,cpp_map_save); lua_setfield(L, -2, "save");
lua_pushcfunction(L,cpp_map_set); lua_setfield(L, -2, "set");
lua_pushcfunction(L,cpp_map_draw); lua_setfield(L, -2, "draw");
lua_pushcfunction(L,cpp_map_getTile); lua_setfield(L, -2, "getTile");
lua_pushcfunction(L,cpp_map_setTile); lua_setfield(L, -2, "setTile");
lua_setglobal(L, "tilemap");
lua_newtable(L);
lua_pushcfunction(L,cpp_pal_load); lua_setfield(L, -2, "load");
lua_pushcfunction(L,cpp_pal_set); lua_setfield(L, -2, "set");
lua_pushcfunction(L,cpp_pal_getColor); lua_setfield(L, -2, "getColor");
lua_pushcfunction(L,cpp_pal_setColor); lua_setfield(L, -2, "setColor");
lua_pushcfunction(L,cpp_pal_trans); lua_setfield(L, -2, "setTransparent");
lua_setglobal(L, "palette");
lua_newtable(L);
lua_pushcfunction(L,cpp_subpalette_resetAll); lua_setfield(L, -2, "resetAll");
lua_pushcfunction(L,cpp_subpalette_set); lua_setfield(L, -2, "set");
lua_pushcfunction(L,cpp_subpalette_reset); lua_setfield(L, -2, "reset");
lua_pushcfunction(L,cpp_subpalette_setRange); lua_setfield(L, -2, "setRange");
lua_pushcfunction(L,cpp_subpalette_resetRange); lua_setfield(L, -2, "resetRange");
lua_setglobal(L, "subpalette");
lua_newtable(L);
lua_pushcfunction(L,cpp_viewport_resetClipping);lua_setfield(L, -2, "resetClipping");
lua_pushcfunction(L,cpp_viewport_setClipping); lua_setfield(L, -2, "setClipping");
lua_pushcfunction(L,cpp_viewport_setOrigin); lua_setfield(L, -2, "setOrigin");
lua_pushcfunction(L,cpp_viewport_getOrigin); lua_setfield(L, -2, "getOrigin");
lua_pushcfunction(L,cpp_viewport_tolocal); lua_setfield(L, -2, "tolocal");
lua_setglobal(L, "viewport");
lua_newtable(L);
lua_pushcfunction(L,cpp_draw_line); lua_setfield(L, -2, "line");
lua_pushcfunction(L,cpp_draw_hline); lua_setfield(L, -2, "hline");
lua_pushcfunction(L,cpp_draw_vline); lua_setfield(L, -2, "vline");
lua_pushcfunction(L,cpp_draw_rect); lua_setfield(L, -2, "rect");
lua_pushcfunction(L,cpp_draw_rectfill); lua_setfield(L, -2, "rectFill");
lua_pushcfunction(L,cpp_draw_circ); lua_setfield(L, -2, "circ");
lua_pushcfunction(L,cpp_draw_circfill); lua_setfield(L, -2, "circFill");
lua_pushcfunction(L,cpp_draw_oval); lua_setfield(L, -2, "oval");
lua_pushcfunction(L,cpp_draw_ovalfill); lua_setfield(L, -2, "ovalFill");
lua_pushcfunction(L,cpp_draw_pattern); lua_setfield(L, -2, "setPattern");
//lua_pushcfunction(L,cpp_draw_tline); lua_setfield(L, -2, "tline");
//lua_pushcfunction(L,cpp_draw_thline); lua_setfield(L, -2, "thline");
//lua_pushcfunction(L,cpp_draw_tvline); lua_setfield(L, -2, "tvline");
lua_pushcfunction(L,cpp_draw_surface); lua_setfield(L, -2, "surface");
lua_pushcfunction(L,cpp_draw_surfaceRotated); lua_setfield(L, -2, "surfaceRotated");
lua_pushcfunction(L,cpp_draw_text); lua_setfield(L, -2, "text");
lua_setglobal(L, "draw");
lua_newtable(L);
lua_pushcfunction(L,cpp_music_play); lua_setfield(L, -2, "play");
lua_pushcfunction(L,cpp_music_pause); lua_setfield(L, -2, "pause");
lua_pushcfunction(L,cpp_music_resume); lua_setfield(L, -2, "resume");
lua_pushcfunction(L,cpp_music_stop); lua_setfield(L, -2, "stop");
lua_pushcfunction(L,cpp_music_setPosition); lua_setfield(L, -2, "setPosition");
lua_pushcfunction(L,cpp_music_getPosition); lua_setfield(L, -2, "getPosition");
lua_setglobal(L, "music");
lua_newtable(L);
lua_pushcfunction(L,cpp_sound_load); lua_setfield(L, -2, "load");
lua_pushcfunction(L,cpp_sound_free); lua_setfield(L, -2, "free");
lua_pushcfunction(L,cpp_sound_play); lua_setfield(L, -2, "play");
lua_pushcfunction(L,cpp_sound_stop); lua_setfield(L, -2, "stop");
lua_setglobal(L, "sound");
lua_newtable(L);
lua_pushcfunction(L,cpp_sys_time); lua_setfield(L, -2, "getTime");
lua_pushcfunction(L,cpp_sys_setBeat); lua_setfield(L, -2, "setBeat");
lua_pushcfunction(L,cpp_sys_isBeat); lua_setfield(L, -2, "isBeat");
lua_pushcfunction(L,cpp_sys_updateFullSpeed); lua_setfield(L, -2, "updateAtFullSpeed");
lua_pushcfunction(L,cpp_sys_updateEvents); lua_setfield(L, -2, "updateOnlyOnEvents");
lua_pushcfunction(L,cpp_sys_updateTimeout); lua_setfield(L, -2, "updateOnEventsAndTimeout");
lua_pushcfunction(L,cpp_sys_dir); lua_setfield(L, -2, "getFilesInDataDirectory");
lua_pushcfunction(L,cpp_sys_exit); lua_setfield(L, -2, "quit");
lua_setglobal(L, "system");
lua_newtable(L);
lua_pushcfunction(L,cpp_win_setZoom); lua_setfield(L, -2, "setZoom");
lua_pushcfunction(L,cpp_win_getZoom); lua_setfield(L, -2, "getZoom");
lua_pushcfunction(L,cpp_win_setFullscreen); lua_setfield(L, -2, "setFullscreen");
lua_pushcfunction(L,cpp_win_getFullscreen); lua_setfield(L, -2, "getFullscreen");
lua_pushcfunction(L,cpp_win_showCursor); lua_setfield(L, -2, "showCursor");
lua_pushcfunction(L,cpp_win_getResolution); lua_setfield(L, -2, "getResolution");
lua_pushcfunction(L,cpp_win_setResolution); lua_setfield(L, -2, "setResolution");
lua_setglobal(L, "window");
lua_newtable(L);
lua_pushcfunction(L,cpp_conf_setKey); lua_setfield(L, -2, "setKey");
lua_pushcfunction(L,cpp_conf_getKey); lua_setfield(L, -2, "getKey");
lua_pushcfunction(L,cpp_conf_folder); lua_setfield(L, -2, "getConfigFolder");
lua_setglobal(L, "config");
lua_newtable(L);
lua_pushcfunction(L,cpp_mouse_pos); lua_setfield(L, -2, "getPos");
lua_pushcfunction(L,cpp_mouse_wheel); lua_setfield(L, -2, "getWheel");
lua_pushcfunction(L,cpp_mouse_down); lua_setfield(L, -2, "buttonDown");
lua_pushcfunction(L,cpp_mouse_press); lua_setfield(L, -2, "buttonPressed");
lua_setglobal(L, "mouse");
lua_newtable(L);
lua_pushcfunction(L,cpp_key_down); lua_setfield(L, -2, "keyDown");
lua_pushcfunction(L,cpp_key_press); lua_setfield(L, -2, "keyPressed");
lua_pushcfunction(L,cpp_key_any); lua_setfield(L, -2, "anyKeyPressed");
lua_setglobal(L, "keyboard");
lua_newtable(L);
lua_pushinteger(L, 0); lua_setfield(L, -2, "UNKNOWN");
lua_pushinteger(L, 4); lua_setfield(L, -2, "A");
lua_pushinteger(L, 5); lua_setfield(L, -2, "B");
lua_pushinteger(L, 6); lua_setfield(L, -2, "C");
lua_pushinteger(L, 7); lua_setfield(L, -2, "D");
lua_pushinteger(L, 8); lua_setfield(L, -2, "E");
lua_pushinteger(L, 9); lua_setfield(L, -2, "F");
lua_pushinteger(L, 10); lua_setfield(L, -2, "G");
lua_pushinteger(L, 11); lua_setfield(L, -2, "H");
lua_pushinteger(L, 12); lua_setfield(L, -2, "I");
lua_pushinteger(L, 13); lua_setfield(L, -2, "J");
lua_pushinteger(L, 14); lua_setfield(L, -2, "K");
lua_pushinteger(L, 15); lua_setfield(L, -2, "L");
lua_pushinteger(L, 16); lua_setfield(L, -2, "M");
lua_pushinteger(L, 17); lua_setfield(L, -2, "N");
lua_pushinteger(L, 18); lua_setfield(L, -2, "O");
lua_pushinteger(L, 19); lua_setfield(L, -2, "P");
lua_pushinteger(L, 20); lua_setfield(L, -2, "Q");
lua_pushinteger(L, 21); lua_setfield(L, -2, "R");
lua_pushinteger(L, 22); lua_setfield(L, -2, "S");
lua_pushinteger(L, 23); lua_setfield(L, -2, "T");
lua_pushinteger(L, 24); lua_setfield(L, -2, "U");
lua_pushinteger(L, 25); lua_setfield(L, -2, "V");
lua_pushinteger(L, 26); lua_setfield(L, -2, "W");
lua_pushinteger(L, 27); lua_setfield(L, -2, "X");
lua_pushinteger(L, 28); lua_setfield(L, -2, "Y");
lua_pushinteger(L, 29); lua_setfield(L, -2, "Z");
lua_pushinteger(L, 30); lua_setfield(L, -2, "N1");
lua_pushinteger(L, 31); lua_setfield(L, -2, "N2");
lua_pushinteger(L, 32); lua_setfield(L, -2, "N3");
lua_pushinteger(L, 33); lua_setfield(L, -2, "N4");
lua_pushinteger(L, 34); lua_setfield(L, -2, "N5");
lua_pushinteger(L, 35); lua_setfield(L, -2, "N6");
lua_pushinteger(L, 36); lua_setfield(L, -2, "N7");
lua_pushinteger(L, 37); lua_setfield(L, -2, "N8");
lua_pushinteger(L, 38); lua_setfield(L, -2, "N9");
lua_pushinteger(L, 39); lua_setfield(L, -2, "N0");
lua_pushinteger(L, 40); lua_setfield(L, -2, "RETURN");
lua_pushinteger(L, 41); lua_setfield(L, -2, "ESCAPE");
lua_pushinteger(L, 42); lua_setfield(L, -2, "BACKSPACE");
lua_pushinteger(L, 43); lua_setfield(L, -2, "TAB");
lua_pushinteger(L, 44); lua_setfield(L, -2, "SPACE");
lua_pushinteger(L, 45); lua_setfield(L, -2, "MINUS");
lua_pushinteger(L, 46); lua_setfield(L, -2, "EQUALS");
lua_pushinteger(L, 47); lua_setfield(L, -2, "LEFTBRACKET");
lua_pushinteger(L, 48); lua_setfield(L, -2, "RIGHTBRACKET");
lua_pushinteger(L, 49); lua_setfield(L, -2, "BACKSLASH");
lua_pushinteger(L, 50); lua_setfield(L, -2, "NONUSHASH");
lua_pushinteger(L, 51); lua_setfield(L, -2, "SEMICOLON");
lua_pushinteger(L, 52); lua_setfield(L, -2, "APOSTROPHE");
lua_pushinteger(L, 53); lua_setfield(L, -2, "GRAVE");
lua_pushinteger(L, 54); lua_setfield(L, -2, "COMMA");
lua_pushinteger(L, 55); lua_setfield(L, -2, "PERIOD");
lua_pushinteger(L, 56); lua_setfield(L, -2, "SLASH");
lua_pushinteger(L, 57); lua_setfield(L, -2, "CAPSLOCK");
lua_pushinteger(L, 58); lua_setfield(L, -2, "F1");
lua_pushinteger(L, 59); lua_setfield(L, -2, "F2");
lua_pushinteger(L, 60); lua_setfield(L, -2, "F3");
lua_pushinteger(L, 61); lua_setfield(L, -2, "F4");
lua_pushinteger(L, 62); lua_setfield(L, -2, "F5");
lua_pushinteger(L, 63); lua_setfield(L, -2, "F6");
lua_pushinteger(L, 64); lua_setfield(L, -2, "F7");
lua_pushinteger(L, 65); lua_setfield(L, -2, "F8");
lua_pushinteger(L, 66); lua_setfield(L, -2, "F9");
lua_pushinteger(L, 67); lua_setfield(L, -2, "F10");
lua_pushinteger(L, 68); lua_setfield(L, -2, "F11");
lua_pushinteger(L, 69); lua_setfield(L, -2, "F12");
lua_pushinteger(L, 70); lua_setfield(L, -2, "PRINTSCREEN");
lua_pushinteger(L, 71); lua_setfield(L, -2, "SCROLLLOCK");
lua_pushinteger(L, 72); lua_setfield(L, -2, "PAUSE");
lua_pushinteger(L, 73); lua_setfield(L, -2, "INSERT");
lua_pushinteger(L, 74); lua_setfield(L, -2, "HOME");
lua_pushinteger(L, 75); lua_setfield(L, -2, "PAGEUP");
lua_pushinteger(L, 76); lua_setfield(L, -2, "DELETE");
lua_pushinteger(L, 77); lua_setfield(L, -2, "END");
lua_pushinteger(L, 78); lua_setfield(L, -2, "PAGEDOWN");
lua_pushinteger(L, 79); lua_setfield(L, -2, "RIGHT");
lua_pushinteger(L, 80); lua_setfield(L, -2, "LEFT");
lua_pushinteger(L, 81); lua_setfield(L, -2, "DOWN");
lua_pushinteger(L, 82); lua_setfield(L, -2, "UP");
lua_pushinteger(L, 83); lua_setfield(L, -2, "NUMLOCKCLEAR");
lua_pushinteger(L, 84); lua_setfield(L, -2, "KP_DIVIDE");
lua_pushinteger(L, 85); lua_setfield(L, -2, "KP_MULTIPLY");
lua_pushinteger(L, 86); lua_setfield(L, -2, "KP_MINUS");
lua_pushinteger(L, 87); lua_setfield(L, -2, "KP_PLUS");
lua_pushinteger(L, 88); lua_setfield(L, -2, "KP_ENTER");
lua_pushinteger(L, 89); lua_setfield(L, -2, "KP_1");
lua_pushinteger(L, 90); lua_setfield(L, -2, "KP_2");
lua_pushinteger(L, 91); lua_setfield(L, -2, "KP_3");
lua_pushinteger(L, 92); lua_setfield(L, -2, "KP_4");
lua_pushinteger(L, 93); lua_setfield(L, -2, "KP_5");
lua_pushinteger(L, 94); lua_setfield(L, -2, "KP_6");
lua_pushinteger(L, 95); lua_setfield(L, -2, "KP_7");
lua_pushinteger(L, 96); lua_setfield(L, -2, "KP_8");
lua_pushinteger(L, 97); lua_setfield(L, -2, "KP_9");
lua_pushinteger(L, 98); lua_setfield(L, -2, "KP_0");
lua_pushinteger(L, 99); lua_setfield(L, -2, "KP_PERIOD");
lua_pushinteger(L, 100); lua_setfield(L, -2, "NONUSBACKSLASH");
lua_pushinteger(L, 101); lua_setfield(L, -2, "APPLICATION");
lua_pushinteger(L, 224); lua_setfield(L, -2, "LCTRL");
lua_pushinteger(L, 225); lua_setfield(L, -2, "LSHIFT");
lua_pushinteger(L, 226); lua_setfield(L, -2, "LALT");
lua_pushinteger(L, 227); lua_setfield(L, -2, "LGUI");
lua_pushinteger(L, 228); lua_setfield(L, -2, "RCTRL");
lua_pushinteger(L, 229); lua_setfield(L, -2, "RSHIFT");
lua_pushinteger(L, 230); lua_setfield(L, -2, "RALT");
lua_pushinteger(L, 231); lua_setfield(L, -2, "RGUI");
lua_setglobal(L, "key");
lua_newtable(L);
lua_pushcfunction(L,cpp_pad_down); lua_setfield(L, -2, "buttonDown");
lua_pushcfunction(L,cpp_pad_press); lua_setfield(L, -2, "buttonPressed");
lua_pushcfunction(L,cpp_pad_any); lua_setfield(L, -2, "anyButtonPressed");
lua_setglobal(L, "gamepad");
lua_newtable(L);
lua_pushinteger(L, -1); lua_setfield(L, -2, "INVALID");
lua_pushinteger(L, 0); lua_setfield(L, -2, "A");
lua_pushinteger(L, 1); lua_setfield(L, -2, "B");
lua_pushinteger(L, 2); lua_setfield(L, -2, "X");
lua_pushinteger(L, 3); lua_setfield(L, -2, "Y");
lua_pushinteger(L, 4); lua_setfield(L, -2, "BACK");
lua_pushinteger(L, 5); lua_setfield(L, -2, "GUIDE");
lua_pushinteger(L, 6); lua_setfield(L, -2, "START");
lua_pushinteger(L, 7); lua_setfield(L, -2, "LEFTSTICK");
lua_pushinteger(L, 8); lua_setfield(L, -2, "RIGHTSTICK");
lua_pushinteger(L, 9); lua_setfield(L, -2, "LEFTSHOULDER");
lua_pushinteger(L, 10); lua_setfield(L, -2, "RIGHTSHOULDER");
lua_pushinteger(L, 11); lua_setfield(L, -2, "UP");
lua_pushinteger(L, 12); lua_setfield(L, -2, "DOWN");
lua_pushinteger(L, 13); lua_setfield(L, -2, "LEFT");
lua_pushinteger(L, 14); lua_setfield(L, -2, "RIGHT");
lua_pushinteger(L, 15); lua_setfield(L, -2, "MISC1");
lua_pushinteger(L, 16); lua_setfield(L, -2, "PADDLE1");
lua_pushinteger(L, 17); lua_setfield(L, -2, "PADDLE2");
lua_pushinteger(L, 18); lua_setfield(L, -2, "PADDLE3");
lua_pushinteger(L, 19); lua_setfield(L, -2, "PADDLE4");
lua_pushinteger(L, 20); lua_setfield(L, -2, "TOUCHPAD");
lua_setglobal(L, "button");
}
int MiniLoader(lua_State *L) {
const char *name = luaL_checkstring(L, 1);
char filename[strlen(name)+5];
strcpy(filename, name);
strcat(filename, ".lua");
int size;
char* buffer = file_getfilebuffer(filename, size);
if (luaL_loadbuffer(L, buffer, size, filename)) {
debug("REQUIRE LOADING ERROR: ");
debug("%s\n",lua_tostring(L, -1));
lua_pop(L,1);
//return ;
}
free(buffer);
return 1;
}
void lua_init(const char *main_lua_file) {
L = luaL_newstate();
luaL_openlibs(L);
push_lua_funcs();
lua_register(L, "mini_loader", MiniLoader);
luaL_dostring(L, "table.insert(package.searchers,2,mini_loader)\n");
int size;
char* buffer = file_getfilebuffer(main_lua_file, size);
if (luaL_loadbuffer(L, buffer, size, "main")) {
debug("LOADING ERROR: ");
debug("%s\n",lua_tostring(L, -1));
lua_pop(L,1);
return;
}
free(buffer);
if (lua_pcall(L,0, LUA_MULTRET, 0)) {
debug("RUNTIME ERROR [BOOT]: ");
//debug("%s\n",lua_tostring(L, -1));
//lua_pop(L,1);
luaL_traceback(L, L, NULL, 1);
debug("%s\n", lua_tostring(L, -1));
lua_pop(L,1);
return;
}
// Check if _init and _update exist
lua_getglobal(L, "mini");
lua_getfield(L, -1, "init");
if (lua_isfunction(L,-1)) init_exists = true;
lua_pop(L,1);
lua_pop(L,1);
lua_getglobal(L, "mini");
lua_getfield(L, -1, "update");
if (lua_isfunction(L,-1)) update_exists = true;
lua_pop(L,1);
lua_pop(L,1);
is_playing = true;
}
void lua_call_init() {
if (!init_exists) return;
lua_getglobal(L, "mini");
lua_getfield(L, -1, "init");
if (lua_pcall(L, 0, 0, 0)) {
debug("RUNTIME ERROR [INIT]: ");
debug("%s\n",lua_tostring(L, -1));
lua_pop(L,1);
luaL_traceback(L, L, NULL, 1);
debug("%s\n", lua_tostring(L, -1));
lua_pop(L,1);
is_playing = false;
}
}
void lua_call_update() {
if (!update_exists) return;
lua_getglobal(L, "mini");
lua_getfield(L, -1, "update");
if (lua_pcall(L, 0, 0, 0)) {
debug("RUNTIME ERROR [UPDATE]: ");
debug("%s\n",lua_tostring(L, -1));
lua_pop(L,1);
luaL_traceback(L, L, NULL, 1);
debug("%s\n", lua_tostring(L, -1));
lua_pop(L,1);
is_playing = false;
}
}
void lua_quit() {
if (!is_playing) return;
is_playing = false;
lua_close(L);
}