# SRB2Kart Saturn: Custom lua features ## mobj.localskin and player.localskin fields Allow reading and assigning localskins. ## mobj.rollsum field **Not netsafe**. Returns total sprite rotation value, taking sliptideroll and sloperoll cvars value into account. Mainly for use in visual-only addons like secondcolor. ## player.sliproll field **Not netsafe**. Returns player's current sliptide roll angle, taking sliptideroll cvar value into account. ## hud.setVoteBackground(name) Changes vote background texture prefix (game looks for PREFIX + "W" or "C" (depends on resolution) + FRAME\_NUMBER). ## hud.add(fn, "vote") and hud.add(fn, "intermission") Hud hooks for vote screen and intermission screen. They only get drawer (`v`) as argument. To check if those hooks are available, check if globals FEATURE\_VOTEHUD and FEATURE\_INTERMISSIONHUD exist. ## x, y = hud.getOffsets(item) Returns the values of the given HUD item's `xoffset`/`yoffset` cvars. Available for any HUD item with offset cvars. ## patch = v.cachePatchRotated(name, rollangle) Like v.cachePatch, it caches a new patch with the corresponding name. Unlike v.cachePatch, however, a rollangle can be supplied to the function so that it returns a rotated patch instead. ## x, y, flags = v.getDrawInfo(item) Returns the X, Y and flags where the given HUD item will be drawn for the current displayplayer. Available for `item`, `gametypeinfo` and `minimap`. ## patch, colormap = v.getColorHudPatch(item) Returns the patch and colormap to use for the given HUD item. Colorization is based on the user's settings. Available for `item` and `itemmul`. Extra arguments for some items: ### item * `small`: true for small item box, false for big item box. * `dark`: true to darken item box. Depends on `darkitembox`. ### itemmul * `small`: true for small sticker, false for big sticker. ## hudcolor = v.getHudColor() Returns the displayplayer's HUD color. ## colorize = v.useColorHud() Returns true if colorization is enabled, false otherwise. ## v.interpolate(true) Enables HUD interpolation. Each call to a drawing function will have its coordinates interpolated by assigning an unique ID to every call. For example, three successive calls to `v.draw` will each have their own ID and interpolation offsets. Pass `true` to enable interpolation, `false` to disable. Alternatively, pass a number to enable interpolation with the specified tag. Tags allow HUD items drawn by the same call to a drawing function to be differentiated. Valid tags range from 0-255. For example, when iterating players, use a unique tag for each player to avoid artifacting: ```lua for p in players.iterate do -- enable interpolation, using player numbers as the tag -- every draw will have different interp offsets per player v.interpolate(#p) -- doesn't matter for unconditional draws like this one... v.draw(...) -- but it does matter if there's a condition! -- without tags, this patch would warp between players -- whenever their `someVar` changes if p.someVar then v.draw(...) end end -- don't want interpolation anymore? then disable it v.interpolate(false) ``` NOTE: The default tag for `true` is 0. ## v.interpLatch(true) Enables interpolation offset latching. The next call to a drawing function will have its lerp offsets saved and reused for all following draw calls. Disable with `false` when done. Interpolation cannot easily "snap" between two points; latching can help overcome this by manually setting the lerp offsets. ```lua v.interpolate(true) -- X coordinate for the HUD item -- every so often, this will wrap around to zero local x = (leveltime*4) % 256 -- draw an interpolated patch, but... when X rolls back to zero, -- the patch will slide all the way across the screen! v.draw(x, 100, ...) -- this is where interpLatch comes into play -- enable latching, then draw an invisible patch, -- moving at the same speed as the visible patch -- the exact coordinates don't matter, it just has to move at the right speed v.interpLatch(true) v.draw(leveltime*4, 0, v.cachePatch("K_TRNULL")) -- now we can draw the patch again, and when X becomes zero, -- it'll snap right back without sliding across the screen v.draw(x, 150, ...) -- don't forget to turn off latching! v.interpLatch(false) ``` When using a custom string drawer, enable this mode to avoid interpolation artifacting when the string changes. ## mobj.spritexscale, mobj.spriteyscale, mobj.spritexoffset, mobj.spriteyoffset, mobj.rollangle, mobj.sloperoll, mobj.rollmodel fields Same fields as in SRB2 2.2 ## S\_StopSoundByNum Allows stopping specific sound globally. Because this function starts with S\_, like state, checking if it exists is a bit more complicated: ```lua if rawget(_G, "S_StopSoundByNum") ~= nil then ... -- Can use it end ``` ## addHook("ServerJoin", function()) ServerJoin hook called when client joins server (starting a listen server also calls it for host). Generally it was made to make loading custom config files less hacky, but can be used for anything else too. ## player.viewrollangle field Returns player's current view roll angle for the Screen Tilting feature, useful for HUD elements. ## G_SetPlayerGamepadIndicatorColor(player, skincolor) Set a custom color for Supported Gamepads with RGB LED functionality. To be used with Displayplayers. Only takes Skincolors. Best to be used in a Loop to ensure the color wont get overwritten by the game. ## G_PlayerDeviceRumble(player, low_strength, high_strength, -optional- duration) Add Gamepad Rumble support for things. To be used with Displayplayers. Duration is in milliseconds and is optional to set, default value is 84ms. ## P_CheckSightFast(mo1, mo2) Exactly same as P_CheckSight but uses cheaper algorithm, useful for things like nametags. Doesn't work exactly like P_CheckSight so don't use it for anything gameplay-related. # Other changes ## P_PlayRinglossSound(source, damager) Add optional `damager` argument (should be `mobj_t`), which causes hurt sound also play for damager if `karthitemdialog` option is enabled ## K_PlayHitEmSound(mobj, victim) Add optional `victim` argument (should be a player's `mobj_t`), which causes "hit em" sound to be delayed and played for victim too if `karthitemdialog` option is enabled