ldd-CC/dodge.lua

216 lines
5.3 KiB
Lua
Raw Permalink Normal View History

2019-01-20 19:16:59 +00:00
--[[
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()
2019-01-20 19:23:18 +00:00
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
2019-01-20 19:16:59 +00:00
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()
2019-01-20 19:23:18 +00:00
tsv(false)
2019-01-20 19:16:59 +00:00
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)
2019-01-20 19:23:18 +00:00
for y = 2, walls[x].top do
2019-01-20 19:16:59 +00:00
term.setCursorPos(x,y)
term.write(" ")
end
2019-01-20 19:23:18 +00:00
for y = walls[x].bottom, scr_y - 1 do
2019-01-20 19:16:59 +00:00
term.setCursorPos(x,y)
term.write(" ")
end
end
term.setCursorPos(2,1)
term.setBackgroundColor(colors.black)
term.write("SCORE: "..score.." | TIME: "..time)
2019-01-20 19:23:18 +00:00
tsv(true)
2019-01-20 19:16:59 +00:00
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
2019-01-20 19:23:18 +00:00
ypos = math.random(4, scr_y-3)
2019-01-20 19:16:59 +00:00
wf = 3
2019-01-20 19:23:18 +00:00
randomcol = 2^math.random(1, 14)
2019-01-20 19:16:59 +00:00
end
if wf > 0 then
wf = wf - 1
end
if not term.isColor() then
randomcol = colors.black --Shame.
end
2019-01-20 19:23:18 +00:00
addNewWall(ypos-gap, ypos+gap, randomcol)
2019-01-20 19:16:59 +00:00
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
2019-01-20 19:23:18 +00:00
sleep(0.05)
if guyY <= walls[guyX].top or guyY >= walls[guyX].bottom then
2019-01-20 19:16:59 +00:00
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 !",
2019-01-20 19:23:18 +00:00
"What, gotta catch your breath?",
2019-01-20 19:16:59 +00:00
"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
2019-01-20 19:23:18 +00:00
local uut = parallel.waitForAny(getInput, doGame, keepTime)
2019-01-20 19:16:59 +00:00
if uut == 2 then
renderTEXT()
end
sleep(0.05)
term.setCursorPos(1,scr_y)
term.setBackgroundColor(colors.black)
2019-01-20 19:23:18 +00:00
term.clearLine()