mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
Some checks failed
Build coop / build-linux (push) Has been cancelled
Build coop / build-steamos (push) Has been cancelled
Build coop / build-windows-opengl (push) Has been cancelled
Build coop / build-windows-directx (push) Has been cancelled
Build coop / build-macos-arm (push) Has been cancelled
Build coop / build-macos-intel (push) Has been cancelled
248 lines
No EOL
6.4 KiB
Lua
248 lines
No EOL
6.4 KiB
Lua
-- localize functions to improve performance - a-utils.lua
|
|
local string_lower,string_format,table_insert,get_date_and_time = string.lower,string.format,table.insert,get_date_and_time
|
|
|
|
-- Version Data --
|
|
MOD_VERSION_API = 1
|
|
MOD_VERSION_MAJOR = 14
|
|
MOD_VERSION_MINOR = 1
|
|
MOD_VERSION_INDEV = false
|
|
MOD_VERSION_STRING = tostring(MOD_VERSION_API) .. "." .. tostring(MOD_VERSION_MAJOR) .. (MOD_VERSION_MINOR > 0 and ("." .. tostring(MOD_VERSION_MINOR)) or "") .. (MOD_VERSION_INDEV and " (In-Dev)" or "")
|
|
MOD_VERSION_DEBUG = tostring(GITHUB_REPO) .. " | " .. tostring(GITHUB_COMMIT_ID) .. " | " .. tostring(GITHUB_COMMIT_TIME)
|
|
|
|
if VERSION_NUMBER < 38 then
|
|
djui_popup_create("\n\\#FFAAAA\\Character Select requires\n the latest version of CoopDX to use!\n\nYou can find CoopDX here:\n\\#6666FF\\https://sm64coopdx.com", 5)
|
|
incompatibleClient = true
|
|
return 0
|
|
end
|
|
|
|
local dependacyFiles = {
|
|
-- Required Lua File
|
|
--"a-github.lua",
|
|
"dialog.lua",
|
|
"main.lua",
|
|
"n-hud.lua",
|
|
"o-api.lua",
|
|
"z-moveset.lua",
|
|
"z-palettes.lua",
|
|
"z-voice.lua",
|
|
-- Required Actors
|
|
"actors/armature_geo.bin",
|
|
}
|
|
local legacyFiles = {
|
|
"voice.lua",
|
|
"palettes.lua",
|
|
"z-anims.lua",
|
|
}
|
|
|
|
local fileErrorList = {}
|
|
|
|
-- Check for Missing Files
|
|
for i = 1, #dependacyFiles do
|
|
if not mod_file_exists(dependacyFiles[i]) then
|
|
log_to_console("Character Select file missing: '" .. dependacyFiles[i] .. "'", CONSOLE_MESSAGE_WARNING)
|
|
table_insert(fileErrorList, "Missing File '" .. dependacyFiles[i] .. "'")
|
|
end
|
|
end
|
|
-- Check for Legacy Files
|
|
for i = 1, #legacyFiles do
|
|
if mod_file_exists(legacyFiles[i]) then
|
|
log_to_console("Character Select legacy file found: '" .. legacyFiles[i] .. "'", CONSOLE_MESSAGE_WARNING)
|
|
table_insert(fileErrorList, "Legacy File '" .. legacyFiles[i] .. "'")
|
|
end
|
|
end
|
|
if #fileErrorList > 0 then
|
|
incompatibleClient = true
|
|
local frameCount = 0
|
|
hook_event(HOOK_UPDATE, function ()
|
|
frameCount = frameCount + 1
|
|
if frameCount == 5 then
|
|
local errorString = "\\#FFAAAA\\Character Select File Issues:"
|
|
djui_popup_create("\\#FFAAAA\\Character Select is having\nfile issues and cannot load!\n\nErrors have been logged in chat!", 4)
|
|
for i = 1, #fileErrorList do
|
|
errorString = errorString .. "\n" .. fileErrorList[i]
|
|
end
|
|
errorString = errorString .. "\n\nThe best way to resolve these issues is to delete your current version of Character Select and then install the latest version!"
|
|
|
|
log_to_console(errorString)
|
|
djui_chat_message_create(errorString)
|
|
end
|
|
end)
|
|
return 0
|
|
end
|
|
|
|
ommActive = false
|
|
for i in pairs(gActiveMods) do
|
|
if gActiveMods[i].relativePath == "omm-coop" then
|
|
ommActive = true
|
|
break
|
|
end
|
|
end
|
|
|
|
E_MODEL_ARMATURE = smlua_model_util_get_id("armature_geo")
|
|
|
|
local saveableCharacters = {
|
|
["1"] = 1,
|
|
["2"] = 1,
|
|
["3"] = 1,
|
|
["4"] = 1,
|
|
["5"] = 1,
|
|
["6"] = 1,
|
|
["7"] = 1,
|
|
["8"] = 1,
|
|
["9"] = 1,
|
|
["0"] = 1,
|
|
["a"] = 1,
|
|
["b"] = 1,
|
|
["c"] = 1,
|
|
["d"] = 1,
|
|
["e"] = 1,
|
|
["f"] = 1,
|
|
["g"] = 1,
|
|
["h"] = 1,
|
|
["i"] = 1,
|
|
["j"] = 1,
|
|
["k"] = 1,
|
|
["l"] = 1,
|
|
["m"] = 1,
|
|
["n"] = 1,
|
|
["o"] = 1,
|
|
["p"] = 1,
|
|
["q"] = 1,
|
|
["r"] = 1,
|
|
["s"] = 1,
|
|
["t"] = 1,
|
|
["u"] = 1,
|
|
["v"] = 1,
|
|
["w"] = 1,
|
|
["x"] = 1,
|
|
["y"] = 1,
|
|
["z"] = 1,
|
|
["_"] = 1,
|
|
["-"] = 1,
|
|
["."] = 1,
|
|
|
|
-- Replace with Underscore
|
|
[" "] = 0,
|
|
}
|
|
|
|
--- @param string string
|
|
--- Replaces underscores in the string with spaces
|
|
function string_underscore_to_space(string)
|
|
if string == nil then return "" end
|
|
return string:gsub("_", " ")
|
|
end
|
|
|
|
--- @param string string
|
|
--- Constructs a new string but only with characters from `saveableCharacters`
|
|
--- * Spaces are the notable character that gets turned into an underscore
|
|
function string_space_to_underscore(string)
|
|
local s = ''
|
|
for i = 1, #string do
|
|
local c = string:sub(i,i)
|
|
if saveableCharacters[string_lower(c)] == 1 then
|
|
s = s .. c
|
|
elseif saveableCharacters[string_lower(c)] == 0 then
|
|
s = s .. "_"
|
|
end
|
|
end
|
|
return s
|
|
end
|
|
|
|
--- @param string string
|
|
--- Splits a string into a table by spaces
|
|
function string_split(string, splitAt)
|
|
if splitAt == nil then
|
|
splitAt = " "
|
|
end
|
|
local result = {}
|
|
for match in string:gmatch(string_format("[^%s]+", splitAt)) do
|
|
table_insert(result, match)
|
|
end
|
|
return result
|
|
end
|
|
|
|
--- @param param number
|
|
--- @param caseTable table
|
|
--- Switch statement function
|
|
function switch(param, caseTable)
|
|
local case = caseTable[param]
|
|
if case then return case() end
|
|
local def = caseTable['default']
|
|
return def and def() or nil
|
|
end
|
|
|
|
function clamp(num, min, max)
|
|
return math.max(math.min(num, max), min)
|
|
end
|
|
|
|
function lerp(a, b, t)
|
|
return a * (1 - t) + b * t
|
|
end
|
|
|
|
allowMenu = {}
|
|
|
|
renderInMenuTable = {
|
|
front = {},
|
|
back = {},
|
|
}
|
|
|
|
queueStorageFailsafe = false
|
|
|
|
charBeingSet = false
|
|
|
|
stopPalettes = false
|
|
for i in pairs(gActiveMods) do
|
|
if (gActiveMods[i].incompatible ~= nil and gActiveMods[i].incompatible:find("gamemode")) and not (gActiveMods[i].name:find("Personal Star Counter")) then
|
|
stopPalettes = true
|
|
end
|
|
end
|
|
|
|
stopMovesets = false
|
|
|
|
seasonalEvent = 0
|
|
SEASON_EVENT_BIRTHDAY = 1
|
|
SEASON_EVENT_CHRISTMAS = 2
|
|
-- December
|
|
if get_date_and_time().month == 11 then
|
|
if get_date_and_time().day == 3 then
|
|
-- Character Select's Birthday
|
|
seasonalEvent = SEASON_EVENT_BIRTHDAY
|
|
else
|
|
-- Christmas
|
|
seasonalEvent = SEASON_EVENT_CHRISTMAS
|
|
end
|
|
end
|
|
|
|
-- Dedicated Networking Table for Character Select
|
|
gCSPlayers = {}
|
|
for i = 0, MAX_PLAYERS - 1 do
|
|
gCSPlayers[i] = {
|
|
index = network_global_index_from_local(i),
|
|
saveName = "Default",
|
|
currAlt = 1,
|
|
presetPalette = 0,
|
|
offset = 0,
|
|
forceChar = 0,
|
|
modelId = E_MODEL_MARIO,
|
|
isUpdating = false,
|
|
movesetToggle = true,
|
|
modelEditOffset = 0,
|
|
inMenu = false,
|
|
}
|
|
end
|
|
|
|
local stallPacket = 0
|
|
local function update()
|
|
stallPacket = (stallPacket+1)%3 -- refresh rate (to reduce stress)
|
|
if stallPacket == 0 then
|
|
network_send(false, gCSPlayers[0])
|
|
end
|
|
end
|
|
|
|
local function on_packet_recieve(data)
|
|
local index = network_local_index_from_global(data.index)
|
|
gCSPlayers[index] = data
|
|
end
|
|
|
|
hook_event(HOOK_ON_PACKET_RECEIVE, on_packet_recieve)
|
|
hook_event(HOOK_UPDATE, update) |