mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Expose K_AddItemToReel and K_PushToRouletteItemList to Lua
This commit is contained in:
parent
f1898078c2
commit
a6f228ec29
3 changed files with 167 additions and 28 deletions
|
|
@ -860,20 +860,11 @@ static void K_InitRoulette(itemroulette_t *const roulette)
|
|||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
static void K_PushToRouletteItemList(itemroulette_t *const roulette, INT32 item)
|
||||
void K_PushToRouletteItemList(itemroulette_t *const roulette, INT32 item)
|
||||
|
||||
Pushes a new item to the end of the item
|
||||
roulette's item list. Also accepts slot machine
|
||||
values instead of items.
|
||||
|
||||
Input Arguments:-
|
||||
roulette - The item roulette data to modify.
|
||||
item - The item / slot machine index to push to the list.
|
||||
|
||||
Return:-
|
||||
N/A
|
||||
See header file for description.
|
||||
--------------------------------------------------*/
|
||||
static void K_PushToRouletteItemList(itemroulette_t *const roulette, INT32 item)
|
||||
void K_PushToRouletteItemList(itemroulette_t *const roulette, INT32 item)
|
||||
{
|
||||
#ifdef ITEM_LIST_SIZE
|
||||
if (roulette->itemList.len >= ITEM_LIST_SIZE)
|
||||
|
|
@ -906,23 +897,11 @@ static void K_PushToRouletteItemList(itemroulette_t *const roulette, INT32 item)
|
|||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
static void K_AddItemToReel(const player_t *player, itemroulette_t *const roulette, kartitems_t item)
|
||||
void K_AddItemToReel(const player_t *player, itemroulette_t *const roulette, kartitems_t item)
|
||||
|
||||
Adds an item to a player's item reel. Unlike
|
||||
pushing directly with K_PushToRouletteItemList,
|
||||
this function handles special behaviors (like
|
||||
padding with extra Super Rings).
|
||||
|
||||
Input Arguments:-
|
||||
player - The player to add to the item roulette.
|
||||
This is valid to be NULL.
|
||||
roulette - The player's item roulette data.
|
||||
item - The item to push to the list.
|
||||
|
||||
Return:-
|
||||
N/A
|
||||
See header file for description.
|
||||
--------------------------------------------------*/
|
||||
static void K_AddItemToReel(const player_t *player, itemroulette_t *const roulette, kartitems_t item)
|
||||
void K_AddItemToReel(const player_t *player, itemroulette_t *const roulette, kartitems_t item)
|
||||
{
|
||||
K_PushToRouletteItemList(roulette, item);
|
||||
|
||||
|
|
@ -1270,7 +1249,7 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (ringbox == true)
|
||||
{
|
||||
// If this is being invoked by a Ring Box, it should literally never produce items.
|
||||
|
|
|
|||
|
|
@ -76,6 +76,42 @@ boolean K_ItemSingularity(kartitems_t item);
|
|||
|
||||
botItemPriority_e K_GetBotItemPriority(kartitems_t result);
|
||||
|
||||
/*--------------------------------------------------
|
||||
void K_PushToRouletteItemList(itemroulette_t *const roulette, INT32 item)
|
||||
|
||||
Pushes a new item to the end of the item
|
||||
roulette's item list. Also accepts slot machine
|
||||
values instead of items.
|
||||
|
||||
Input Arguments:-
|
||||
roulette - The item roulette data to modify.
|
||||
item - The item / slot machine index to push to the list.
|
||||
|
||||
Return:-
|
||||
N/A
|
||||
--------------------------------------------------*/
|
||||
|
||||
void K_PushToRouletteItemList(itemroulette_t *const roulette, INT32 item);
|
||||
|
||||
/*--------------------------------------------------
|
||||
void K_AddItemToReel(const player_t *player, itemroulette_t *const roulette, kartitems_t item)
|
||||
|
||||
Adds an item to a player's item reel. Unlike
|
||||
pushing directly with K_PushToRouletteItemList,
|
||||
this function handles special behaviors (like
|
||||
padding with extra Super Rings).
|
||||
|
||||
Input Arguments:-
|
||||
player - The player to add to the item roulette.
|
||||
This is valid to be NULL.
|
||||
roulette - The player's item roulette data.
|
||||
item - The item to push to the list.
|
||||
|
||||
Return:-
|
||||
N/A
|
||||
--------------------------------------------------*/
|
||||
|
||||
void K_AddItemToReel(const player_t *player, itemroulette_t *const roulette, kartitems_t item);
|
||||
|
||||
/*--------------------------------------------------
|
||||
INT32 K_KartGetBattleOdds(const player_t *player, itemroulette_t *const roulette, UINT8 pos, kartitems_t item);
|
||||
|
|
|
|||
|
|
@ -4081,6 +4081,128 @@ static int lib_kGetBotItemPriority(lua_State *L)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static void getItemRouletteOrPlayerBasedOnFirstParam(lua_State *L, player_t **player, itemroulette_t **itemRoulette)
|
||||
{
|
||||
/*
|
||||
JugadorXEI @ 11/01/2024 (MM/DD/AAAA):
|
||||
Ok, so.
|
||||
I implemented luaL_testudata from Lua 5.2 because I wanted to test if an argument
|
||||
was one userdata type or the other, and it worked. ...And then it didn't work, for some reason.
|
||||
I was debugging this for 4 hours and couldn't figure it out.
|
||||
So, raw-ass Lua funcs, here we go. THIS works.
|
||||
Working with pointers gives me a headache.
|
||||
*/
|
||||
void *p = lua_touserdata(L, 1);
|
||||
if (p != NULL)
|
||||
{
|
||||
if (lua_getmetatable(L, 1))
|
||||
{
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, META_ITEMROULETTE);
|
||||
if (lua_rawequal(L, -1, -2))
|
||||
{
|
||||
*itemRoulette = *(itemroulette_t **)p;
|
||||
}
|
||||
else
|
||||
{
|
||||
lua_pop(L, 1);
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, META_PLAYER);
|
||||
if (lua_rawequal(L, -1, -2))
|
||||
{
|
||||
*player = *(player_t **)p;
|
||||
*itemRoulette = &(*player)->itemRoulette;
|
||||
}
|
||||
lua_pop(L, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int lib_kAddItemToReel(lua_State *L)
|
||||
{
|
||||
player_t *player = NULL;
|
||||
itemroulette_t *itemRoulette = NULL;
|
||||
|
||||
getItemRouletteOrPlayerBasedOnFirstParam(L, &player, &itemRoulette);
|
||||
|
||||
NOHUD
|
||||
INLEVEL
|
||||
if (!player && !itemRoulette)
|
||||
return LUA_ErrInvalid(L, "player_t/itemroulette_t");
|
||||
|
||||
if (lua_isnumber(L, 2))
|
||||
{
|
||||
kartitems_t item = luaL_checkinteger(L, 2);
|
||||
K_AddItemToReel(player, itemRoulette, item);
|
||||
}
|
||||
else if (lua_istable(L, 2))
|
||||
{
|
||||
luaL_checktype(L, 2, LUA_TTABLE);
|
||||
size_t size = luaL_getn(L, 2);
|
||||
|
||||
for (size_t i = 1; i <= size; i++)
|
||||
{
|
||||
lua_rawgeti(L, 2, i);
|
||||
if (lua_isnumber(L, -1))
|
||||
{
|
||||
kartitems_t item = luaL_checkinteger(L, -1);
|
||||
K_AddItemToReel(player, itemRoulette, item);
|
||||
}
|
||||
else // Quit early, let the scripter know they messed up.
|
||||
{
|
||||
lua_pop(L, 1);
|
||||
return luaL_error(L, "Non-integer value in table in index %d.", i);
|
||||
}
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
}
|
||||
else return LUA_ErrInvalid(L, "integer/table");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lib_kPushToRouletteItemList(lua_State *L)
|
||||
{
|
||||
player_t *player = NULL;
|
||||
itemroulette_t *itemRoulette = NULL;
|
||||
|
||||
getItemRouletteOrPlayerBasedOnFirstParam(L, &player, &itemRoulette);
|
||||
|
||||
NOHUD
|
||||
INLEVEL
|
||||
if (!player && !itemRoulette)
|
||||
return LUA_ErrInvalid(L, "player_t/itemroulette_t");
|
||||
|
||||
if (lua_isnumber(L, 2))
|
||||
{
|
||||
kartitems_t item = luaL_checkinteger(L, 2);
|
||||
K_PushToRouletteItemList(itemRoulette, item);
|
||||
}
|
||||
else if (lua_istable(L, 2))
|
||||
{
|
||||
luaL_checktype(L, 2, LUA_TTABLE);
|
||||
size_t size = luaL_getn(L, 2);
|
||||
|
||||
for (size_t i = 1; i <= size; i++)
|
||||
{
|
||||
lua_rawgeti(L, 2, i);
|
||||
if (lua_isnumber(L, -1))
|
||||
{
|
||||
kartitems_t item = luaL_checkinteger(L, -1);
|
||||
K_PushToRouletteItemList(itemRoulette, item);
|
||||
}
|
||||
else // Quit early, let the scripter know they messed up.
|
||||
{
|
||||
lua_pop(L, 1);
|
||||
return luaL_error(L, "Non-integer value in table in index %d.", i);
|
||||
}
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
}
|
||||
else return LUA_ErrInvalid(L, "integer/table");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lib_getTimeMicros(lua_State *L)
|
||||
{
|
||||
lua_pushinteger(L, I_GetPreciseTime() / (I_GetPrecisePrecision() / 1000000));
|
||||
|
|
@ -4371,6 +4493,8 @@ static luaL_Reg lib[] = {
|
|||
{"K_ItemEnabled", lib_kItemEnabled},
|
||||
{"K_ItemSingularity", lib_kItemSingularity},
|
||||
{"K_GetBotItemPriority", lib_kGetBotItemPriority},
|
||||
{"K_AddItemToReel", lib_kAddItemToReel},
|
||||
{"K_PushToRouletteItemList", lib_kPushToRouletteItemList},
|
||||
|
||||
// hu_stuff technically?
|
||||
{"HU_DoTitlecardCEcho", lib_startTitlecardCecho},
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue