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
|
See header file for description.
|
||||||
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
|
|
||||||
--------------------------------------------------*/
|
--------------------------------------------------*/
|
||||||
static void K_PushToRouletteItemList(itemroulette_t *const roulette, INT32 item)
|
void K_PushToRouletteItemList(itemroulette_t *const roulette, INT32 item)
|
||||||
{
|
{
|
||||||
#ifdef ITEM_LIST_SIZE
|
#ifdef ITEM_LIST_SIZE
|
||||||
if (roulette->itemList.len >= 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
|
See header file for description.
|
||||||
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
|
|
||||||
--------------------------------------------------*/
|
--------------------------------------------------*/
|
||||||
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);
|
K_PushToRouletteItemList(roulette, item);
|
||||||
|
|
||||||
|
|
@ -1270,7 +1249,7 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ringbox == true)
|
if (ringbox == true)
|
||||||
{
|
{
|
||||||
// If this is being invoked by a Ring Box, it should literally never produce items.
|
// 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);
|
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);
|
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;
|
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)
|
static int lib_getTimeMicros(lua_State *L)
|
||||||
{
|
{
|
||||||
lua_pushinteger(L, I_GetPreciseTime() / (I_GetPrecisePrecision() / 1000000));
|
lua_pushinteger(L, I_GetPreciseTime() / (I_GetPrecisePrecision() / 1000000));
|
||||||
|
|
@ -4371,6 +4493,8 @@ static luaL_Reg lib[] = {
|
||||||
{"K_ItemEnabled", lib_kItemEnabled},
|
{"K_ItemEnabled", lib_kItemEnabled},
|
||||||
{"K_ItemSingularity", lib_kItemSingularity},
|
{"K_ItemSingularity", lib_kItemSingularity},
|
||||||
{"K_GetBotItemPriority", lib_kGetBotItemPriority},
|
{"K_GetBotItemPriority", lib_kGetBotItemPriority},
|
||||||
|
{"K_AddItemToReel", lib_kAddItemToReel},
|
||||||
|
{"K_PushToRouletteItemList", lib_kPushToRouletteItemList},
|
||||||
|
|
||||||
// hu_stuff technically?
|
// hu_stuff technically?
|
||||||
{"HU_DoTitlecardCEcho", lib_startTitlecardCecho},
|
{"HU_DoTitlecardCEcho", lib_startTitlecardCecho},
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue