ldd-CC/dodge.lua

216 lines
5.3 KiB
Lua

--[[
Wall Dodge! What a riveting game!
Dodge the walls before they kill you.
Download with:
pastebin get fDTts7wz dodge
std PB fDTts7wz dodge
std ld dodge dodge
--]]
local scr_x, scr_y = term.getSize()
local keysDown = {} -- holds all pressed keys. It's way better than using "key" event for movement
local walls = {} -- holds all screen data for walls. I could do slants if I wanted, not just walls
local frame = 0 -- for every screen update-oh, you know what a frame is
local maxFrame = 26 -- max frames until new wall
local fframe = 0 -- not a typo. is the buffer of spaces until the spaces between walls shrinks
local maxFFrame = 6 -- max fframes until the space between walls gets slightly tighter (down to 5, good luck m8)
local pause = false -- pausing is a nice thing
local tsv = function(visible) -- monitors don't have term.current().setVisible, damn you
if term.current().setVisible then
term.current().setVisible(visible)
end
end
for a = 1, scr_x do
table.insert(walls,{top=1,bottom=scr_y,color=colors.black})
end
local score = 0 --increases for every wall.
local time = 0 --in seconds, increases in increments of 0.1
local addNewWall = function(top,bottom,color)
table.remove(walls,1)
table.insert(walls,{top=top,bottom=bottom,color=color})
end
local guyX = 2
local guyY = math.floor(scr_y/2)
local maxY = scr_y-1
local minY = 2
local clearLines = function(y1,y2)
local _x,_y = term.getCursorPos()
for a = y1, y2 or y1 do
term.setCursorPos(1,a)
term.clearLine()
end
term.setCursorPos(_x,_y)
end
local renderTEXT = function(_txt)
local txt = _txt or "YOU ARE DEAD"
local midY = math.floor(scr_y/2)
for a = 0, 2 do
term.setBackgroundColor(colors.gray)
clearLines(midY-a,midY+a)
sleep(0.1)
end
term.setCursorPos(4,midY)
term.write(txt)
end
local trymove = function(dir)
if (guyY+dir)>=minY and (guyY+dir)<=maxY then
guyY = guyY + dir
return true
end
return false
end
local render = function()
tsv(false)
term.setBackgroundColor(colors.white)
term.setTextColor(colors.white)
term.clear()
term.setCursorPos(guyX,guyY)
term.setBackgroundColor(colors.black)
term.write(" ")
term.setCursorPos(1,1)
term.clearLine()
term.setCursorPos(1,scr_y)
term.clearLine()
for x = 1, #walls do
term.setBackgroundColor(walls[x].color)
for y = 2, walls[x].top do
term.setCursorPos(x,y)
term.write(" ")
end
for y = walls[x].bottom, scr_y - 1 do
term.setCursorPos(x,y)
term.write(" ")
end
end
term.setCursorPos(2,1)
term.setBackgroundColor(colors.black)
term.write("SCORE: "..score.." | TIME: "..time)
tsv(true)
end
local keepTime = function()
time = 0
while true do
sleep(0.1)
if not pause then
time = time + 0.1
end
end
end
local doGame = function()
local wf = 0
local gap = 2
local ypos, randomcol
while true do
if not pause then
if frame >= maxFrame or wf > 0 then
if frame >= maxFrame then
frame = 0
fframe = fframe + 1
ypos = math.random(4, scr_y-3)
wf = 3
randomcol = 2^math.random(1, 14)
end
if wf > 0 then
wf = wf - 1
end
if not term.isColor() then
randomcol = colors.black --Shame.
end
addNewWall(ypos-gap, ypos+gap, randomcol)
else
frame = frame + 1
addNewWall(1,scr_y,colors.black)
end
if fframe >= maxFFrame then
fframe = 0
if maxFrame > 7 then
maxFrame = maxFrame - 1
end
end
if keysDown[keys.up] then
trymove(-1)
end
if keysDown[keys.down] then
trymove(1)
end
if walls[guyX-1].top > 1 or walls[guyX-1].bottom < scr_y then
if walls[guyX].top < walls[guyX-1].top or walls[guyX].bottom > walls[guyX-1].bottom then
score = score + 1
end
end
render()
end
sleep(0.05)
if guyY <= walls[guyX].top or guyY >= walls[guyX].bottom then
return "dead"
end
end
end
local getInput = function()
while true do
local evt = {os.pullEvent()}
if evt[1] == "key" then
if evt[2] == keys.q then
return "quit"
end
if evt[2] == keys.p then
pause = not pause
if pause then
local pauseMSGs = {
"PAUSED",
"Paused. Press 'P' to resume",
"The game is paused",
"GAME PAUSE !",
"What, gotta catch your breath?",
"Paused, the game is, hmmm?",
"PAUSED GAME",
"GAME PAUSED",
"THE GAME IS PAUSED",
"THE PAUSED IS GAME",
"Buh-buh-buh-BEEP",
"UNPAUSE WITH 'P'",
"Tip: press UP to go up",
"Tip: press DOWN to go down",
"YOU HAVE NO CHANCE TO SURVIVE MAKE YOUR TIME",
"-PAUSED-",
"=PAUSED=",
"PAISED",
"THOUST GAME BE PAUSETH",
"Yon game is paused. Obvious exits are 'Q', 'CTRL+T'",
"Tip: don't hit the walls",
"Tip: press 'P' to pause the game",
}
renderTEXT(pauseMSGs[math.random(1,#pauseMSGs)])
keysDown[keys.up] = false
keysDown[keys.down] = false
end
end
keysDown[evt[2]] = true
end
if evt[1] == "key_up" then
keysDown[evt[2]] = false
end
end
end
local uut = parallel.waitForAny(getInput, doGame, keepTime)
if uut == 2 then
renderTEXT()
end
sleep(0.05)
term.setCursorPos(1,scr_y)
term.setBackgroundColor(colors.black)
term.clearLine()