Compare commits
4 Commits
apfd
...
553afc606d
Author | SHA1 | Date | |
---|---|---|---|
553afc606d | |||
c792dd1079 | |||
ee251b7a44 | |||
0bde2a7fea |
193
leaderboard.lua
193
leaderboard.lua
@ -12,18 +12,15 @@ local splits = {}
|
||||
local PATCH = nil
|
||||
local help = true
|
||||
|
||||
local LIFE = {}
|
||||
local faceranks = {}
|
||||
local dvd = {}
|
||||
|
||||
local UNCLAIMED = "Unclaimed Record"
|
||||
local HELP_MESSAGE = "\x89Leaderboard Commands:\nretry exit findmap changelevel spba_clearcheats lb_gui rival scroll"
|
||||
local HELP_MESSAGE = "\x89Leaderboard Commands:\nretry exit findmap changelevel spba_clearcheats lb_gui rival scroll encore"
|
||||
local FILENAME = "leaderboard.txt"
|
||||
|
||||
-- Retry / changelevel map
|
||||
local nextMap = nil
|
||||
|
||||
local Flags = 0
|
||||
local F_ENCORE = 0x80
|
||||
|
||||
-- SPB flags with the least significance first
|
||||
local F_SPBATK = 0x1
|
||||
@ -65,6 +62,8 @@ local clamp
|
||||
local scroll_to
|
||||
|
||||
local ticsToTime
|
||||
|
||||
local allowJoin
|
||||
---------------
|
||||
|
||||
local cv_gui = CV_RegisterVar({
|
||||
@ -88,6 +87,9 @@ local cv_enable = CV_RegisterVar({
|
||||
PossibleValue = CV_OnOff,
|
||||
func = function(v)
|
||||
disable = $ or not v.value
|
||||
if disable then
|
||||
allowJoin(true)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
@ -214,7 +216,7 @@ else
|
||||
print("Failed to open file: ", FILENAME)
|
||||
end
|
||||
|
||||
local function allowJoin(v)
|
||||
function allowJoin(v)
|
||||
if not cv_interrupt.value then
|
||||
local y
|
||||
if v then
|
||||
@ -356,6 +358,20 @@ local function changelevel(player, ...)
|
||||
end
|
||||
COM_AddCommand("changelevel", changelevel)
|
||||
|
||||
local function toggleEncore(player)
|
||||
if not doyoudare(player) then
|
||||
return
|
||||
end
|
||||
|
||||
local enc = CV_FindVar("kartencore")
|
||||
if enc.value then
|
||||
COM_BufInsertText(server, "kartencore off")
|
||||
else
|
||||
COM_BufInsertText(server, "kartencore on")
|
||||
end
|
||||
end
|
||||
COM_AddCommand("encore", toggleEncore)
|
||||
|
||||
local function clearcheats(player)
|
||||
if not player.spectator then
|
||||
clearcheats = true
|
||||
@ -535,23 +551,6 @@ COM_AddCommand("rival", findRival)
|
||||
-- end
|
||||
--end
|
||||
|
||||
|
||||
local cellSize = 16
|
||||
local function spawnCells(n)
|
||||
local p = leveltime
|
||||
for i = 0,n do
|
||||
local x = (i * p) % (320/cellSize)
|
||||
p = p + 7
|
||||
local y = (i * p) % (200/cellSize)
|
||||
p = p % 42 + 1
|
||||
|
||||
if not(LIFE[x] and LIFE[y]) then
|
||||
LIFE[x] = $ or {}
|
||||
LIFE[x][y] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
addHook("MapLoad", function()
|
||||
timeFinished = 0
|
||||
splits = {}
|
||||
@ -562,18 +561,9 @@ addHook("MapLoad", function()
|
||||
|
||||
allowJoin(true)
|
||||
--printTable(lb)
|
||||
|
||||
LIFE = {}
|
||||
dvd = {}
|
||||
end
|
||||
)
|
||||
|
||||
local function life(player, ...)
|
||||
local n = ...
|
||||
spawnCells(n)
|
||||
end
|
||||
COM_AddCommand("life", life)
|
||||
|
||||
function ticsToTime(tics, pure)
|
||||
if tics == 0 and pure then
|
||||
return "-:--:--"
|
||||
@ -587,111 +577,6 @@ function ticsToTime(tics, pure)
|
||||
)
|
||||
end
|
||||
|
||||
local function ticLife()
|
||||
local neigh = {}
|
||||
local new = {}
|
||||
|
||||
for x, t in pairs(LIFE) do
|
||||
for y, v in pairs(t) do
|
||||
neigh[x-1] = $ or {}
|
||||
neigh[x] = $ or {}
|
||||
neigh[x+1] = $ or {}
|
||||
|
||||
neigh[x-1][y-1] = $ and $ + 1 or 1
|
||||
neigh[x-1][y] = $ and $ + 1 or 1
|
||||
neigh[x-1][y+1] = $ and $ + 1 or 1
|
||||
|
||||
neigh[x][y-1] = $ and $ + 1 or 1
|
||||
neigh[x][y+1] = $ and $ + 1 or 1
|
||||
|
||||
neigh[x+1][y-1] = $ and $ + 1 or 1
|
||||
neigh[x+1][y] = $ and $ + 1 or 1
|
||||
neigh[x+1][y+1] = $ and $ + 1 or 1
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
for x, t in pairs(neigh) do
|
||||
if x >= 0 and x * cellSize < 320 then
|
||||
for y, v in pairs(t) do
|
||||
if y >= 0 and y * cellSize < 200 then
|
||||
-- 3 neighbours dead cell
|
||||
if v == 3 and (LIFE[x] == nil or LIFE[x][y] == nil) then
|
||||
new[x] = $ or {}
|
||||
new[x][y] = true
|
||||
elseif v >= 2 and v <= 3 and (LIFE[x] and LIFE[x][y] != nil) then
|
||||
new[x] = $ or {}
|
||||
new[x][y] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
LIFE = new
|
||||
end
|
||||
|
||||
local function drawLife(v, player)
|
||||
for x, t in pairs(LIFE) do
|
||||
for y, _ in pairs(t) do
|
||||
v.drawScaled(
|
||||
x * cellSize * FRACUNIT,
|
||||
y * cellSize * FRACUNIT,
|
||||
FixedDiv(cellSize * FRACUNIT, 16 * FRACUNIT),
|
||||
PATCH["FACERANK"][faceranks[((x + y) % #faceranks) + 1]],
|
||||
0,
|
||||
v.getColormap("sonic", player.skincolor)
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function spawnDvd(p)
|
||||
local size = (((p + leveltime) % 3) + 1) * 16
|
||||
local rank = (#faceranks and faceranks[((p + leveltime) % #faceranks) + 1]) or "sonic"
|
||||
local d = {
|
||||
["x"] = max(((p + leveltime % 320) - size), 0) * FRACUNIT,
|
||||
["y"] = max(((p + leveltime % 200) - size), 0) * FRACUNIT,
|
||||
["xvel"] = (((p + leveltime) % 7) + 1) * FRACUNIT / 2,
|
||||
["yvel"] = (((p + leveltime) % 5) + 1) * FRACUNIT / 2,
|
||||
["rank"] = rank,
|
||||
["color"] = ((p + leveltime) % MAXSKINCOLORS - 1) + 1,
|
||||
["size"] = size,
|
||||
}
|
||||
|
||||
table.insert(dvd, d)
|
||||
end
|
||||
|
||||
local function ticDvd()
|
||||
for i, d in ipairs(dvd) do
|
||||
d.x = $ + d.xvel
|
||||
d.y = $ + d.yvel
|
||||
|
||||
if d.x < 0 or d.x + d.size * FRACUNIT > 320 * FRACUNIT then
|
||||
d.xvel = -$
|
||||
clamp(0, d.x, 320 * FRACUNIT)
|
||||
end
|
||||
|
||||
if d.y < 0 or d.y + d.size * FRACUNIT > 200 * FRACUNIT then
|
||||
d.yvel = -$
|
||||
clamp(0, d.y, 200 * FRACUNIT)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function drawDvd(v, player)
|
||||
for i, d in ipairs(dvd) do
|
||||
v.drawScaled(
|
||||
d.x,
|
||||
d.y,
|
||||
FixedDiv(d.size * FRACUNIT, 16 * FRACUNIT),
|
||||
PATCH["FACERANK"][d.rank],
|
||||
0,
|
||||
v.getColormap("sonic", d.color)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
-- Item patches have the amazing property of being displaced 12x 13y pixels
|
||||
local iXoffset = 13 * FRACUNIT
|
||||
local iYoffset = 12 * FRACUNIT
|
||||
@ -751,12 +636,25 @@ local FACERANK_DIM = 16
|
||||
local FACERANK_SPC = FACERANK_DIM + 4
|
||||
local function drawScore(v, player, pos, x, y, gui, faceRank, score, drawPos, textVFlags)
|
||||
textVFlags = textVFlags or V_HUDTRANSHALF
|
||||
|
||||
--draw Patch/chili
|
||||
v.draw(x, y, faceRank, V_HUDTRANS | VFLAGS, v.getColormap("sonic", score["color"]))
|
||||
if player.name == score["name"] then
|
||||
v.draw(x, y, PATCH["CHILI"][(leveltime / 4) % 8], V_HUDTRANS | VFLAGS)
|
||||
end
|
||||
|
||||
-- Encore
|
||||
if score["flags"] & F_ENCORE then
|
||||
local bob = sin((leveltime + i * 5) * (ANG10))
|
||||
v.drawScaled(
|
||||
x * FRACUNIT,
|
||||
bob + (y + FACERANK_DIM / 2) * FRACUNIT,
|
||||
FRACUNIT / 6,
|
||||
PATCH["RUBY"],
|
||||
V_HUDTRANS
|
||||
)
|
||||
end
|
||||
|
||||
-- SPB
|
||||
if score["flags"] & F_SPBATK then
|
||||
local scale = FRACUNIT / 4
|
||||
@ -948,9 +846,6 @@ local function drawScoreboard(v, player)
|
||||
if player != displayplayers[0] then return end
|
||||
|
||||
cachePatches(v)
|
||||
|
||||
drawLife(v, player)
|
||||
drawDvd(v, player)
|
||||
|
||||
local scoreTable = getScoreTable(gamemap, Flags)
|
||||
|
||||
@ -979,7 +874,6 @@ function cachePatches(v)
|
||||
PATCH["FACERANK"] = {}
|
||||
for skin in skins.iterate do
|
||||
PATCH["FACERANK"][skin.name] = v.cachePatch(skin.facerank)
|
||||
table.insert(faceranks, skin.name)
|
||||
end
|
||||
|
||||
PATCH["SPB"] = v.cachePatch("K_ISSPB")
|
||||
@ -989,6 +883,7 @@ function cachePatches(v)
|
||||
end
|
||||
PATCH["BIG"] = v.cachePatch("K_ISGROW")
|
||||
PATCH["HYUD"] = v.cachePatch("K_ISHYUD")
|
||||
PATCH["RUBY"] = v.cachePatch("RUBYICON")
|
||||
end
|
||||
end
|
||||
|
||||
@ -1098,10 +993,6 @@ end
|
||||
|
||||
local function regLap(player)
|
||||
if player.laps > prevLap and timeFinished == 0 then
|
||||
spawnCells(1000)
|
||||
for i = 0,player.laps * 3 do
|
||||
spawnDvd((i + 1) + 7)
|
||||
end
|
||||
prevLap = player.laps
|
||||
table.insert(splits, player.realtime)
|
||||
showSplit = 5 * TICRATE
|
||||
@ -1149,12 +1040,6 @@ local function think()
|
||||
|
||||
showSplit = max(0, showSplit - 1)
|
||||
|
||||
if leveltime % 10 == 0 then
|
||||
ticLife()
|
||||
end
|
||||
|
||||
ticDvd()
|
||||
|
||||
local p = getGamer()
|
||||
if leveltime < START_TIME then
|
||||
-- Help message
|
||||
@ -1170,7 +1055,13 @@ local function think()
|
||||
end
|
||||
|
||||
-- Autospec
|
||||
-- Encore
|
||||
if leveltime == 1 then
|
||||
Flags = $ & !F_ENCORE
|
||||
if encoremode then
|
||||
Flags = $ | F_ENCORE
|
||||
end
|
||||
|
||||
if p then
|
||||
for s in players.iterate do
|
||||
if s.valid and s.spectator then
|
||||
|
Reference in New Issue
Block a user