CC-Tweaked/src/main/resources/data/computercraft/lua/rom/programs/fun/advanced/redirection.lua

704 lines
22 KiB
Lua

--CCRedirection by : RamiLego4Game and Dan200--
--Based on Redirection by Dan200: http://www.redirectiongame.com--
--Clearing Screen--
--Vars--
local TermW, TermH = term.getSize()
local sLevelTitle
local tScreen
local oScreen
local SizeW, SizeH
local aExits
local fExit
local nSpeed
local Speed
local fSpeed
local fSpeedS
local bPaused
local Tick
local Blocks
local XOrgin, YOrgin
local fLevel
local function reset()
sLevelTitle = ""
tScreen = {}
oScreen = {}
SizeW, SizeH = TermW, TermH
aExits = 0
fExit = "nop"
nSpeed = 0.6
Speed = nSpeed
fSpeed = 0.2
fSpeedS = false
bPaused = false
Tick = os.startTimer(Speed)
Blocks = 0
XOrgin, YOrgin = 1, 1
term.setBackgroundColor(colors.black)
term.setTextColor(colors.white)
term.clear()
end
local InterFace = {}
InterFace.cExit = colors.red
InterFace.cSpeedD = colors.white
InterFace.cSpeedA = colors.red
InterFace.cTitle = colors.red
local cG = colors.lightGray
local cW = colors.gray
local cS = colors.black
local cR1 = colors.blue
local cR2 = colors.red
local cR3 = colors.green
local cR4 = colors.yellow
local tArgs = { ... }
--Functions--
local function printCentred( yc, stg )
local xc = math.floor((TermW - #stg) / 2) + 1
term.setCursorPos(xc, yc)
term.write( stg )
end
local function centerOrgin()
XOrgin = math.floor(TermW / 2 - SizeW / 2)
YOrgin = math.floor(TermH / 2 - SizeH / 2)
end
local function reMap()
tScreen = nil
tScreen = {}
for x = 1, SizeW do
tScreen[x] = {}
for y = 1, SizeH do
tScreen[x][y] = { space = true, wall = false, ground = false, robot = "zz", start = "zz", exit = "zz" }
end
end
end
local function tablecopy(t)
local t2 = {}
for k, v in pairs(t) do
t2[k] = v
end
return t2
end
local function buMap()
oScreen = nil
oScreen = {}
for x = 1, SizeW do
oScreen[x] = {}
for y = 1, SizeH do
oScreen[x][y] = tablecopy(tScreen[x][y])
end
end
end
local function addRobot(x, y, side, color)
local obj = tScreen[x][y]
local data = side .. color
if obj.wall == nil and obj.robot == nil then
tScreen[x][y].robot = data
else
obj.wall = nil
obj.robot = "zz"
tScreen[x][y].robot = data
end
end
local function addStart(x, y, side, color)
local obj = tScreen[x][y]
local data = side .. color
if obj.wall == nil and obj.space == nil then
tScreen[x][y].start = data
else
obj.wall = nil
obj.space = nil
tScreen[x][y].start = data
end
aExits = aExits + 1
end
local function addGround(x, y)
local obj = tScreen[x][y]
if obj.space == nil and obj.exit == nil and obj.wall == nil and obj.robot == nil and obj.start == nil then
tScreen[x][y].ground = true
else
obj.space = nil
obj.exit = "zz"
obj.wall = nil
obj.robot = "zz"
obj.start = "zz"
tScreen[x][y].ground = true
end
end
local function addExit(x, y, cl)
local obj = tScreen[x][y]
if obj.space == nil and obj.ground == nil and obj.wall == nil and obj.robot == nil and obj.start == nil then
tScreen[x][y].exit = cl
else
obj.space = nil
obj.ground = nil
obj.wall = nil
obj.robot = "zz"
obj.start = "zz"
tScreen[x][y].exit = cl
end
end
local function addWall(x, y)
local obj = tScreen[x][y]
if obj == nil then
return error("Here X" .. x .. " Y" .. y)
end
if obj.space == nil and obj.exit == nil and obj.ground == nil and obj.robot == nil and obj.start == nil then
tScreen[x][y].wall = true
else
obj.space = nil
obj.exit = nil
obj.ground = nil
obj.robot = nil
obj.start = nil
tScreen[x][y].wall = true
end
end
local function loadLevel(nNum)
sLevelTitle = "Level " .. nNum
if nNum == nil then return error("nNum == nil") end
local sDir = fs.getDir( shell.getRunningProgram() )
local sLevelD = sDir .. "/levels/" .. tostring(nNum) .. ".dat"
if not ( fs.exists(sLevelD) or fs.isDir(sLevelD) ) then return error("Level Not Exists : " .. sLevelD) end
fLevel = fs.open(sLevelD, "r")
local wl = true
Blocks = tonumber(string.sub(fLevel.readLine(), 1, 1))
local xSize = #fLevel.readLine() + 2
local Lines = 3
while wl do
local wLine = fLevel.readLine()
if wLine == nil then
fLevel.close()
wl = false
else
xSize = math.max(#wLine + 2, xSize)
Lines = Lines + 1
end
end
SizeW, SizeH = xSize, Lines
reMap()
fLevel = fs.open(sLevelD, "r")
fLevel.readLine()
for Line = 2, Lines - 1 do
local sLine = fLevel.readLine()
local chars = #sLine
for char = 1, chars do
local el = string.sub(sLine, char, char)
if el == "8" then
addGround(char + 1, Line)
elseif el == "0" then
addStart(char + 1, Line, "a", "a")
elseif el == "1" then
addStart(char + 1, Line, "b", "a")
elseif el == "2" then
addStart(char + 1, Line, "c", "a")
elseif el == "3" then
addStart(char + 1, Line, "d", "a")
elseif el == "4" then
addStart(char + 1, Line, "a", "b")
elseif el == "5" then
addStart(char + 1, Line, "b", "b")
elseif el == "6" then
addStart(char + 1, Line, "c", "b")
elseif el == "9" then
addStart(char + 1, Line, "d", "b")
elseif el == "b" then
addExit(char + 1, Line, "a")
elseif el == "e" then
addExit(char + 1, Line, "b")
elseif el == "7" then
addWall(char + 1, Line)
end
end
end
fLevel.close()
end
local function drawStars()
--CCR Background By : RamiLego--
local cStar, cStarG, crStar, crStarB = colors.lightGray, colors.gray, ".", "*"
local DStar, BStar, nStar, gStar = 14, 10, 16, 3
local TermW, TermH = term.getSize()
term.clear()
term.setCursorPos(1, 1)
for x = 1, TermW do
for y = 1, TermH do
local StarT = math.random(1, 30)
if StarT == DStar then
term.setCursorPos(x, y)
term.setTextColor(cStar)
write(crStar)
elseif StarT == BStar then
term.setCursorPos(x, y)
term.setTextColor(cStar)
write(crStarB)
elseif StarT == nStar then
term.setCursorPos(x, y)
term.setTextColor(cStarG)
write(crStar)
elseif StarT == gStar then
term.setCursorPos(x, y)
term.setTextColor(cStarG)
write(crStarB)
end
end
end
end
local function drawMap()
for x = 1, SizeW do
for y = 1, SizeH do
local obj = tScreen[x][y]
if obj.ground == true then
paintutils.drawPixel(XOrgin + x, YOrgin + y + 1, cG)
end
if obj.wall == true then
paintutils.drawPixel(XOrgin + x, YOrgin + y + 1, cW)
end
local ex = tostring(tScreen[x][y].exit)
if not(ex == "zz" or ex == "nil") then
if ex == "a" then
ex = cR1
elseif ex == "b" then
ex = cR2
elseif ex == "c" then
ex = cR3
elseif ex == "d" then
ex = cR4
else
return error("Exit Color Out")
end
term.setBackgroundColor(cG)
term.setTextColor(ex)
term.setCursorPos(XOrgin + x, YOrgin + y + 1)
print("X")
end
local st = tostring(tScreen[x][y].start)
if not(st == "zz" or st == "nil") then
local Cr = string.sub(st, 2, 2)
if Cr == "a" then
Cr = cR1
elseif Cr == "b" then
Cr = cR2
elseif Cr == "c" then
Cr = cR3
elseif Cr == "d" then
Cr = cR4
else
return error("Start Color Out")
end
term.setTextColor(Cr)
term.setBackgroundColor(cG)
term.setCursorPos(XOrgin + x, YOrgin + y + 1)
local sSide = string.sub(st, 1, 1)
if sSide == "a" then
print("^")
elseif sSide == "b" then
print(">")
elseif sSide == "c" then
print("v")
elseif sSide == "d" then
print("<")
else
print("@")
end
end
if obj.space == true then
paintutils.drawPixel(XOrgin + x, YOrgin + y + 1, cS)
end
local rb = tostring(tScreen[x][y].robot)
if not(rb == "zz" or rb == "nil") then
local Cr = string.sub(rb, 2, 2)
if Cr == "a" then
Cr = cR1
elseif Cr == "b" then
Cr = cR2
elseif Cr == "c" then
Cr = cR3
elseif Cr == "d" then
Cr = cR4
else
Cr = colors.white
end
term.setBackgroundColor(Cr)
term.setTextColor(colors.white)
term.setCursorPos(XOrgin + x, YOrgin + y + 1)
local sSide = string.sub(rb, 1, 1)
if sSide == "a" then
print("^")
elseif sSide == "b" then
print(">")
elseif sSide == "c" then
print("v")
elseif sSide == "d" then
print("<")
else
print("@")
end
end
end
end
end
local function isBrick(x, y)
local brb = tostring(tScreen[x][y].robot)
local bobj = oScreen[x][y]
if (brb == "zz" or brb == "nil") and not bobj.wall == true then
return false
else
return true
end
end
local function gRender(sContext)
if sContext == "start" then
for x = 1, SizeW do
for y = 1, SizeH do
local st = tostring(tScreen[x][y].start)
if not(st == "zz" or st == "nil") then
local Cr = string.sub(st, 2, 2)
local sSide = string.sub(st, 1, 1)
addRobot(x, y, sSide, Cr)
end
end
end
elseif sContext == "tick" then
buMap()
for x = 1, SizeW do
for y = 1, SizeH do
local rb = tostring(oScreen[x][y].robot)
if not(rb == "zz" or rb == "nil") then
local Cr = string.sub(rb, 2, 2)
local sSide = string.sub(rb, 1, 1)
local sobj = oScreen[x][y]
if sobj.space == true then
tScreen[x][y].robot = "zz"
if not sSide == "g" then
addRobot(x, y, "g", Cr)
end
elseif sobj.exit == Cr then
if sSide == "a" or sSide == "b" or sSide == "c" or sSide == "d" then
tScreen[x][y].robot = "zz"
addRobot(x, y, "g", Cr)
aExits = aExits - 1
end
elseif sSide == "a" then
local obj = isBrick(x, y - 1)
tScreen[x][y].robot = "zz"
if not obj == true then
addRobot(x, y - 1, sSide, Cr)
else
local obj2 = isBrick(x - 1, y)
local obj3 = isBrick(x + 1, y)
if not obj2 == true and not obj3 == true then
if Cr == "a" then
addRobot(x, y, "d", Cr)
elseif Cr == "b" then
addRobot(x, y, "b", Cr)
end
elseif obj == true and obj2 == true and obj3 == true then
addRobot(x, y, "c", Cr)
else
if obj3 == true then
addRobot(x, y, "d", Cr)
elseif obj2 == true then
addRobot(x, y, "b", Cr)
end
end
end
elseif sSide == "b" then
local obj = isBrick(x + 1, y)
tScreen[x][y].robot = "zz"
if not obj == true then
addRobot(x + 1, y, sSide, Cr)
else
local obj2 = isBrick(x, y - 1)
local obj3 = isBrick(x, y + 1)
if not obj2 == true and not obj3 == true then
if Cr == "a" then
addRobot(x, y, "a", Cr)
elseif Cr == "b" then
addRobot(x, y, "c", Cr)
end
elseif obj == true and obj2 == true and obj3 == true then
addRobot(x, y, "d", Cr)
else
if obj3 == true then
addRobot(x, y, "a", Cr)
elseif obj2 == true then
addRobot(x, y, "c", Cr)
end
end
end
elseif sSide == "c" then
local obj = isBrick(x, y + 1)
tScreen[x][y].robot = "zz"
if not obj == true then
addRobot(x, y + 1, sSide, Cr)
else
local obj2 = isBrick(x - 1, y)
local obj3 = isBrick(x + 1, y)
if not obj2 == true and not obj3 == true then
if Cr == "a" then
addRobot(x, y, "b", Cr)
elseif Cr == "b" then
addRobot(x, y, "d", Cr)
end
elseif obj == true and obj2 == true and obj3 == true then
addRobot(x, y, "a", Cr)
else
if obj3 == true then
addRobot(x, y, "d", Cr)
elseif obj2 == true then
addRobot(x, y, "b", Cr)
end
end
end
elseif sSide == "d" then
local obj = isBrick(x - 1, y)
tScreen[x][y].robot = "zz"
if not obj == true then
addRobot(x - 1, y, sSide, Cr)
else
local obj2 = isBrick(x, y - 1)
local obj3 = isBrick(x, y + 1)
if not obj2 == true and not obj3 == true then
if Cr == "a" then
addRobot(x, y, "c", Cr)
elseif Cr == "b" then
addRobot(x, y, "a", Cr)
end
elseif obj == true and obj2 == true and obj3 == true then
addRobot(x, y, "b", Cr)
else
if obj3 == true then
addRobot(x, y, "a", Cr)
elseif obj2 == true then
addRobot(x, y, "c", Cr)
end
end
end
else
addRobot(x, y, sSide, "g")
end
end
end
end
end
end
function InterFace.drawBar()
term.setBackgroundColor( colors.black )
term.setTextColor( InterFace.cTitle )
printCentred( 1, " " .. sLevelTitle .. " " )
term.setCursorPos(1, 1)
term.setBackgroundColor( cW )
write( " " )
term.setBackgroundColor( colors.black )
write( " x " .. tostring(Blocks) .. " " )
term.setCursorPos( TermW - 8, TermH )
term.setBackgroundColor( colors.black )
term.setTextColour(InterFace.cSpeedD)
write(" <<" )
if bPaused then
term.setTextColour(InterFace.cSpeedA)
else
term.setTextColour(InterFace.cSpeedD)
end
write(" ||")
if fSpeedS then
term.setTextColour(InterFace.cSpeedA)
else
term.setTextColour(InterFace.cSpeedD)
end
write(" >>")
term.setCursorPos( TermW - 1, 1 )
term.setBackgroundColor( colors.black )
term.setTextColour( InterFace.cExit )
write(" X")
term.setBackgroundColor(colors.black)
end
function InterFace.render()
local id, p1, p2, p3 = os.pullEvent()
if id == "mouse_click" then
if p3 == 1 and p2 == TermW then
return "end"
elseif p3 == TermH and p2 >= TermW - 7 and p2 <= TermW - 6 then
return "retry"
elseif p3 == TermH and p2 >= TermW - 4 and p2 <= TermW - 3 then
bPaused = not bPaused
fSpeedS = false
Speed = bPaused and 0 or nSpeed
if Speed > 0 then
Tick = os.startTimer(Speed)
else
Tick = nil
end
InterFace.drawBar()
elseif p3 == TermH and p2 >= TermW - 1 then
bPaused = false
fSpeedS = not fSpeedS
Speed = fSpeedS and fSpeed or nSpeed
Tick = os.startTimer(Speed)
InterFace.drawBar()
elseif p3 - 1 < YOrgin + SizeH + 1 and p3 - 1 > YOrgin and
p2 < XOrgin + SizeW + 1 and p2 > XOrgin then
local eobj = tScreen[p2 - XOrgin][p3 - YOrgin - 1]
local erobj = tostring(tScreen[p2 - XOrgin][p3 - YOrgin - 1].robot)
if (erobj == "zz" or erobj == "nil") and not eobj.wall == true and not eobj.space == true and Blocks > 0 then
addWall(p2 - XOrgin, p3 - YOrgin - 1)
Blocks = Blocks - 1
InterFace.drawBar()
drawMap()
end
end
elseif id == "timer" and p1 == Tick then
gRender("tick")
drawMap()
if Speed > 0 then
Tick = os.startTimer(Speed)
else
Tick = nil
end
end
end
local function startG(LevelN)
drawStars()
loadLevel(LevelN)
centerOrgin()
drawMap()
InterFace.drawBar()
gRender("start")
drawMap()
local NExit = true
if aExits == 0 then
NExit = false
end
while true do
local isExit = InterFace.render()
if isExit == "end" then
return nil
elseif isExit == "retry" then
return LevelN
elseif fExit == "yes" then
if fs.exists( fs.getDir( shell.getRunningProgram() ) .. "/levels/" .. tostring(LevelN + 1) .. ".dat" ) then
return LevelN + 1
else
return nil
end
end
if aExits == 0 and NExit == true then
fExit = "yes"
end
end
end
local ok, err = true, nil
--Menu--
local sStartLevel = tArgs[1]
if ok and not sStartLevel then
ok, err = pcall( function()
term.setTextColor(colors.white)
term.setBackgroundColor( colors.black )
term.clear()
drawStars()
term.setTextColor( colors.red )
printCentred( TermH / 2 - 1, " REDIRECTION " )
printCentred( TermH / 2 - 0, " ComputerCraft Edition " )
term.setTextColor( colors.yellow )
printCentred( TermH / 2 + 2, " Click to Begin " )
os.pullEvent( "mouse_click" )
end )
end
--Game--
if ok then
ok, err = pcall( function()
local nLevel
if sStartLevel then
nLevel = tonumber( sStartLevel )
else
nLevel = 1
end
while nLevel do
reset()
nLevel = startG(nLevel)
end
end )
end
--Upsell screen--
if ok then
ok, err = pcall( function()
term.setTextColor(colors.white)
term.setBackgroundColor( colors.black )
term.clear()
drawStars()
term.setTextColor( colors.red )
if TermW >= 40 then
printCentred( TermH / 2 - 1, " Thank you for playing Redirection " )
printCentred( TermH / 2 - 0, " ComputerCraft Edition " )
printCentred( TermH / 2 + 2, " Check out the full game: " )
term.setTextColor( colors.yellow )
printCentred( TermH / 2 + 3, " http://www.redirectiongame.com " )
else
printCentred( TermH / 2 - 2, " Thank you for " )
printCentred( TermH / 2 - 1, " playing Redirection " )
printCentred( TermH / 2 - 0, " ComputerCraft Edition " )
printCentred( TermH / 2 + 2, " Check out the full game: " )
term.setTextColor( colors.yellow )
printCentred( TermH / 2 + 3, " www.redirectiongame.com " )
end
parallel.waitForAll(
function() sleep(2) end,
function() os.pullEvent( "mouse_click" ) end
)
end )
end
--Clear and exit--
term.setCursorPos(1, 1)
term.setTextColor(colors.white)
term.setBackgroundColor(colors.black)
term.clear()
if not ok then
if err == "Terminated" then
print( "Check out the full version of Redirection:" )
print( "http://www.redirectiongame.com" )
else
printError( err )
end
end