2 Commits

Author SHA1 Message Date
Not
ee251b7a44 Add encore support 2022-04-04 20:58:35 +02:00
Not
0bde2a7fea add encore support 2022-04-04 20:56:03 +02:00

View File

@ -12,10 +12,6 @@ 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 FILENAME = "leaderboard.txt"
@ -24,6 +20,7 @@ local FILENAME = "leaderboard.txt"
local nextMap = nil
local Flags = 0
local F_ENCORE = 0x80
-- SPB flags with the least significance first
local F_SPBATK = 0x1
@ -356,6 +353,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 +546,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 +556,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 +572,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 +631,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
@ -949,9 +842,6 @@ local function drawScoreboard(v, player)
cachePatches(v)
drawLife(v, player)
drawDvd(v, player)
local scoreTable = getScoreTable(gamemap, Flags)
local gui = cv_gui.value
@ -979,7 +869,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 +878,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 +988,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 +1035,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 +1050,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