mirror of
https://github.com/LDDestroier/CC/
synced 2024-11-17 23:34:52 +00:00
Started working on title screen
This commit is contained in:
parent
10636ba026
commit
dd3b9864cb
200
ldris2.lua
200
ldris2.lua
@ -230,6 +230,67 @@ local function between(number, min, max)
|
|||||||
return math.min(math.max(number, min), max)
|
return math.min(math.max(number, min), max)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- image-related functions (from NFTE)
|
||||||
|
local loadImageDataNFT = function(image, background) -- string image
|
||||||
|
local output = {{},{},{}} -- char, text, back
|
||||||
|
local y = 1
|
||||||
|
background = (background or "f"):sub(1,1)
|
||||||
|
local text, back = "f", background
|
||||||
|
local doSkip, c1, c2 = false
|
||||||
|
local tchar = string.char(31) -- for text colors
|
||||||
|
local bchar = string.char(30) -- for background colors
|
||||||
|
local maxX = 0
|
||||||
|
local bx
|
||||||
|
for i = 1, #image do
|
||||||
|
if doSkip then
|
||||||
|
doSkip = false
|
||||||
|
else
|
||||||
|
output[1][y] = output[1][y] or ""
|
||||||
|
output[2][y] = output[2][y] or ""
|
||||||
|
output[3][y] = output[3][y] or ""
|
||||||
|
c1, c2 = image:sub(i,i), image:sub(i+1,i+1)
|
||||||
|
if c1 == tchar then
|
||||||
|
text = c2
|
||||||
|
doSkip = true
|
||||||
|
elseif c1 == bchar then
|
||||||
|
back = c2
|
||||||
|
doSkip = true
|
||||||
|
elseif c1 == "\n" then
|
||||||
|
maxX = math.max(maxX, #output[1][y])
|
||||||
|
y = y + 1
|
||||||
|
text, back = " ", background
|
||||||
|
else
|
||||||
|
output[1][y] = output[1][y]..c1
|
||||||
|
output[2][y] = output[2][y]..text
|
||||||
|
output[3][y] = output[3][y]..back
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for y = 1, #output[1] do
|
||||||
|
output[1][y] = output[1][y] .. (" "):rep(maxX - #output[1][y])
|
||||||
|
output[2][y] = output[2][y] .. (" "):rep(maxX - #output[2][y])
|
||||||
|
output[3][y] = output[3][y] .. (background):rep(maxX - #output[3][y])
|
||||||
|
end
|
||||||
|
return output
|
||||||
|
end
|
||||||
|
|
||||||
|
-- draws an image with the topleft corner at (x, y), with transparency
|
||||||
|
local drawImageTransparent = function(image, x, y, terminal)
|
||||||
|
terminal = terminal or term.current()
|
||||||
|
local cx, cy = terminal.getCursorPos()
|
||||||
|
local c, t, b
|
||||||
|
for iy = 1, #image[1] do
|
||||||
|
for ix = 1, #image[1][iy] do
|
||||||
|
c, t, b = image[1][iy]:sub(ix,ix), image[2][iy]:sub(ix,ix), image[3][iy]:sub(ix,ix)
|
||||||
|
if b ~= " " or c ~= " " then
|
||||||
|
terminal.setCursorPos(x + (ix - 1), y + (iy - 1))
|
||||||
|
terminal.blit(c, t, b)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
terminal.setCursorPos(cx,cy)
|
||||||
|
end
|
||||||
|
|
||||||
-- copies the contents of a table
|
-- copies the contents of a table
|
||||||
table.copy = function(tbl)
|
table.copy = function(tbl)
|
||||||
local output = {}
|
local output = {}
|
||||||
@ -241,14 +302,14 @@ end
|
|||||||
local stringrep = string.rep
|
local stringrep = string.rep
|
||||||
|
|
||||||
-- generates a new board, on which polyominos can be placed and interact
|
-- generates a new board, on which polyominos can be placed and interact
|
||||||
local makeNewBoard = function(x, y, width, height)
|
local makeNewBoard = function(x, y, width, height, blankColor)
|
||||||
local board = {}
|
local board = {}
|
||||||
board.contents = {}
|
board.contents = {}
|
||||||
board.height = height or gameConfig.board_height
|
board.height = height or gameConfig.board_height
|
||||||
board.width = width or gameConfig.board_width
|
board.width = width or gameConfig.board_width
|
||||||
board.x = x
|
board.x = x
|
||||||
board.y = y
|
board.y = y
|
||||||
board.blankColor = "7" -- color if no minos are in that spot
|
board.blankColor = blankColor or "7" -- color if no minos are in that spot
|
||||||
board.transparentColor = "f" -- color if the board tries to render where there is no board
|
board.transparentColor = "f" -- color if the board tries to render where there is no board
|
||||||
board.garbageColor = "8"
|
board.garbageColor = "8"
|
||||||
board.visibleHeight = height and math.floor(height / 2) or gameConfig.board_height_visible
|
board.visibleHeight = height and math.floor(height / 2) or gameConfig.board_height_visible
|
||||||
@ -356,16 +417,17 @@ local makeNewBoard = function(x, y, width, height)
|
|||||||
return board
|
return board
|
||||||
end
|
end
|
||||||
|
|
||||||
local makeNewMino = function(minoID, board, xPos, yPos, oldeMino)
|
local makeNewMino = function(minoTable, minoID, board, xPos, yPos, oldeMino)
|
||||||
local mino = oldeMino or {}
|
local mino = oldeMino or {}
|
||||||
if not gameConfig.minos[minoID] then
|
minoTable = minoTable or gameConfig.minos
|
||||||
|
if not minoTable[minoID] then
|
||||||
error("tried to spawn mino with invalid ID '" .. tostring(minoID) .. "'")
|
error("tried to spawn mino with invalid ID '" .. tostring(minoID) .. "'")
|
||||||
else
|
else
|
||||||
mino.shape = gameConfig.minos[minoID].shape
|
mino.shape = minoTable[minoID].shape
|
||||||
mino.spinID = gameConfig.minos[minoID].spinID
|
mino.spinID = minoTable[minoID].spinID
|
||||||
mino.kickID = gameConfig.minos[minoID].kickID
|
mino.kickID = minoTable[minoID].kickID
|
||||||
mino.color = gameConfig.minos[minoID].color
|
mino.color = minoTable[minoID].color
|
||||||
mino.name = gameConfig.minos[minoID].name
|
mino.name = minoTable[minoID].name
|
||||||
end
|
end
|
||||||
|
|
||||||
mino.finished = false
|
mino.finished = false
|
||||||
@ -397,7 +459,7 @@ local makeNewMino = function(minoID, board, xPos, yPos, oldeMino)
|
|||||||
|
|
||||||
-- takes absolute position (x, y) on board, and returns true if it exists within the bounds of the board
|
-- takes absolute position (x, y) on board, and returns true if it exists within the bounds of the board
|
||||||
local DoesSpotExist = function(x, y)
|
local DoesSpotExist = function(x, y)
|
||||||
return (
|
return board and (
|
||||||
x >= 1 and
|
x >= 1 and
|
||||||
x <= board.width and
|
x <= board.width and
|
||||||
y >= 1 and
|
y >= 1 and
|
||||||
@ -477,7 +539,7 @@ local makeNewMino = function(minoID, board, xPos, yPos, oldeMino)
|
|||||||
mino.width, mino.height = mino.height, mino.width
|
mino.width, mino.height = mino.height, mino.width
|
||||||
mino.shape = output
|
mino.shape = output
|
||||||
-- it's time to do some floor and wall kicking
|
-- it's time to do some floor and wall kicking
|
||||||
if mino.CheckCollision(0, 0) then
|
if mino.board and mino.CheckCollision(0, 0) then
|
||||||
for i = 1, #kickTable[mino.kickID][kickRot] do
|
for i = 1, #kickTable[mino.kickID][kickRot] do
|
||||||
kickX = kickTable[mino.kickID][kickRot][i][1]
|
kickX = kickTable[mino.kickID][kickRot][i][1]
|
||||||
kickY = -kickTable[mino.kickID][kickRot][i][2]
|
kickY = -kickTable[mino.kickID][kickRot][i][2]
|
||||||
@ -508,7 +570,7 @@ local makeNewMino = function(minoID, board, xPos, yPos, oldeMino)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return success
|
return mino, success
|
||||||
end
|
end
|
||||||
|
|
||||||
mino.Move = function(x, y, doSlam, expendLockMove)
|
mino.Move = function(x, y, doSlam, expendLockMove)
|
||||||
@ -628,6 +690,8 @@ local makeNewMino = function(minoID, board, xPos, yPos, oldeMino)
|
|||||||
return mino
|
return mino
|
||||||
end
|
end
|
||||||
|
|
||||||
|
_G.makeNewMino = makeNewMino
|
||||||
|
|
||||||
local random_bag = {}
|
local random_bag = {}
|
||||||
|
|
||||||
local pseudoRandom = function()
|
local pseudoRandom = function()
|
||||||
@ -734,7 +798,7 @@ StartGame = function()
|
|||||||
-- fill the queue
|
-- fill the queue
|
||||||
for i = 1, clientConfig.queue_length do
|
for i = 1, clientConfig.queue_length do
|
||||||
gameState.queue[i] = pseudoRandom()
|
gameState.queue[i] = pseudoRandom()
|
||||||
gameState.queueMinos[i] = makeNewMino(
|
gameState.queueMinos[i] = makeNewMino(nil,
|
||||||
gameState.queue[i],
|
gameState.queue[i],
|
||||||
gameState.queueBoard,
|
gameState.queueBoard,
|
||||||
1,
|
1,
|
||||||
@ -762,7 +826,7 @@ StartGame = function()
|
|||||||
else
|
else
|
||||||
nextPiece = gameState.queue.cyclePiece()
|
nextPiece = gameState.queue.cyclePiece()
|
||||||
end
|
end
|
||||||
return makeNewMino(
|
return makeNewMino(nil,
|
||||||
nextPiece,
|
nextPiece,
|
||||||
gameState.board,
|
gameState.board,
|
||||||
math.floor(gameState.board.width / 2 - 1) + (gameConfig.minos[nextPiece].spawnOffsetX or 0),
|
math.floor(gameState.board.width / 2 - 1) + (gameConfig.minos[nextPiece].spawnOffsetX or 0),
|
||||||
@ -775,7 +839,7 @@ StartGame = function()
|
|||||||
|
|
||||||
local mino, board = gameState.mino, gameState.board
|
local mino, board = gameState.mino, gameState.board
|
||||||
local holdBoard, queueBoard = gameState.holdBoard, gameState.queueBoard
|
local holdBoard, queueBoard = gameState.holdBoard, gameState.queueBoard
|
||||||
local ghostMino = makeNewMino(mino.minoID, gameState.board, mino.x, mino.y, {})
|
local ghostMino = makeNewMino(nil, mino.minoID, gameState.board, mino.x, mino.y, {})
|
||||||
|
|
||||||
local keysDown = {}
|
local keysDown = {}
|
||||||
local tickDelay = 0.05
|
local tickDelay = 0.05
|
||||||
@ -851,7 +915,7 @@ StartGame = function()
|
|||||||
end
|
end
|
||||||
-- draw held piece
|
-- draw held piece
|
||||||
gameState.holdBoard.Clear()
|
gameState.holdBoard.Clear()
|
||||||
makeNewMino(
|
makeNewMino(nil,
|
||||||
gameState.mino.minoID,
|
gameState.mino.minoID,
|
||||||
gameState.holdBoard,
|
gameState.holdBoard,
|
||||||
1, 2, {}
|
1, 2, {}
|
||||||
@ -868,7 +932,7 @@ StartGame = function()
|
|||||||
|
|
||||||
if doMakeNewMino then
|
if doMakeNewMino then
|
||||||
gameState.mino = makeDefaultMino(gameState)
|
gameState.mino = makeDefaultMino(gameState)
|
||||||
ghostMino = makeNewMino(mino.minoID, gameState.board, mino.x, mino.y, {})
|
ghostMino = makeNewMino(nil, mino.minoID, gameState.board, mino.x, mino.y, {})
|
||||||
if (not gameState.didHold) and (clientConfig.appearance_delay > 0) then
|
if (not gameState.didHold) and (clientConfig.appearance_delay > 0) then
|
||||||
gameState.mino.spawnTimer = clientConfig.appearance_delay
|
gameState.mino.spawnTimer = clientConfig.appearance_delay
|
||||||
gameState.mino.active = false
|
gameState.mino.active = false
|
||||||
@ -880,7 +944,7 @@ StartGame = function()
|
|||||||
|
|
||||||
if doAnimateQueue then
|
if doAnimateQueue then
|
||||||
table.remove(gameState.queueMinos, 1)
|
table.remove(gameState.queueMinos, 1)
|
||||||
gameState.queueMinos[#gameState.queueMinos + 1] = makeNewMino(
|
gameState.queueMinos[#gameState.queueMinos + 1] = makeNewMino(nil,
|
||||||
gameState.queue[clientConfig.queue_length],
|
gameState.queue[clientConfig.queue_length],
|
||||||
gameState.queueBoard,
|
gameState.queueBoard,
|
||||||
1,
|
1,
|
||||||
@ -1047,7 +1111,107 @@ StartGame = function()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local TitleScreen = function()
|
local TitleScreen = function()
|
||||||
|
local animation = function()
|
||||||
|
local tsx = 8
|
||||||
|
local tsy = 10
|
||||||
|
--[[
|
||||||
|
local title = {
|
||||||
|
[1] = "ee\nee\neeffe",
|
||||||
|
[2] = "ddfdffd\ndd dffd\nddffd",
|
||||||
|
[3] = "11f1ff1\n11ff1\n11 11f",
|
||||||
|
[4] = "affa\naffa\naf",
|
||||||
|
[5] = "3f3f3f\nf33ff3\n3ff3",
|
||||||
|
[6] = "4ff44f\n 4ff4\n4f4f"
|
||||||
|
}
|
||||||
|
--]]
|
||||||
|
|
||||||
|
--[[
|
||||||
|
1 = " ",
|
||||||
|
"@@@@",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
|
||||||
|
2 = " @ ",
|
||||||
|
"@@@",
|
||||||
|
" ",
|
||||||
|
|
||||||
|
3 = " @",
|
||||||
|
"@@@",
|
||||||
|
" ",
|
||||||
|
|
||||||
|
4 = "@ ",
|
||||||
|
"@@@",
|
||||||
|
" ",
|
||||||
|
|
||||||
|
5 = "@@",
|
||||||
|
"@@",
|
||||||
|
|
||||||
|
6 = " @@",
|
||||||
|
"@@ ",
|
||||||
|
" ",
|
||||||
|
|
||||||
|
7 = "@@ ",
|
||||||
|
" @@",
|
||||||
|
" ",
|
||||||
|
]]
|
||||||
|
|
||||||
|
local animBoard = makeNewBoard(1, 1, scr_x, scr_y * 10/3, "f")
|
||||||
|
animBoard.visibleHeight = animBoard.height / 2
|
||||||
|
|
||||||
|
local animMinos = {}
|
||||||
|
|
||||||
|
local iterate = 0
|
||||||
|
local mTimer = 100000
|
||||||
|
|
||||||
|
local titleMinos = {
|
||||||
|
-- L
|
||||||
|
makeNewMino(nil, 4, animBoard, tsx + 1, tsy).Rotate(0),
|
||||||
|
makeNewMino(nil, 1, animBoard, tsx + 0, tsy).Rotate(3),
|
||||||
|
|
||||||
|
-- D
|
||||||
|
makeNewMino(nil, 7, animBoard, tsx + 6, tsy).Rotate(3),
|
||||||
|
makeNewMino(nil, 3, animBoard, tsx + 4, tsy).Rotate(1),
|
||||||
|
nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for i = 1, #titleMinos do
|
||||||
|
if titleMinos[i] then
|
||||||
|
table.insert(animMinos, titleMinos[i])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
while true do
|
||||||
|
iterate = (iterate + 10) % 360
|
||||||
|
|
||||||
|
if mTimer <= 0 then
|
||||||
|
table.insert(animMinos, makeNewMino(nil,
|
||||||
|
math.random(1, 7),
|
||||||
|
animBoard,
|
||||||
|
math.random(1, animBoard.width - 4),
|
||||||
|
animBoard.visibleHeight - 4
|
||||||
|
))
|
||||||
|
mTimer = 4
|
||||||
|
else
|
||||||
|
mTimer = mTimer - 1
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = 1, #animMinos do
|
||||||
|
animMinos[i].Move(0, 0.75, false)
|
||||||
|
if animMinos[i].y > animBoard.height then
|
||||||
|
table.remove(animMinos, i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
animBoard.Render(table.unpack(animMinos))
|
||||||
|
|
||||||
|
sleep(0.05)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local menu = function()
|
||||||
|
local options = {"Singleplayer", "How to play", "Quit"}
|
||||||
|
|
||||||
|
end
|
||||||
|
--animation()
|
||||||
StartGame()
|
StartGame()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user