I've taken the above codes and gotten very close to making the program work. The problem is that the main loop isn't working right. When you press a key, it either does nothing or only goes to the warp data menu. I don't know whats wrong.
-- Component lib for access to the gpu
local component = require "component"
-- Put term lib into local space..
local term = require "term"
-- Other libs we need as well
local textutils = require("serialization") -- CC to OC. The 'serialize' method is used the same here i think....
local gpu = component.getPrimary("gpu")
local fs = require("filesystem")
local event = require("event")
local keyboard = require("keyboard")
-- 'term' Compatibility. These libs are similar in interface but OC lib has shorter method names.
term.setCursorPos, term.getCursorPos = term.setCursor, term.getCursor
term.setTextColor, term.setBackgroundColor = gpu.setForeground, gpu.setBackground
print("loading...")
Style = {
CDeflt = 0xFFFFFF,
BGDeflt = 0x0000FF,
CTitle = 0x000000,
BGTitle = 0x0092FF,
CWarn = 0xFFFFFF,
BGWarn = 0xFF0000
}
function SetColorDeflt()
term.setBackgroundColor(Style.BGDeflt)
term.setTextColor(Style.CDeflt)
end
function SetColorTitle()
term.setBackgroundColor(Style.BGTitle)
term.setTextColor(Style.CTitle)
end
function SetColorWarn()
term.setBackgroundColor(Style.BGWarn)
term.setTextColor(Style.CWarn)
end
function Clear()
term.clear()
term.setCursorPos(1,1)
end
function Show(Text)
term.write(Text)
local xt,yt = term.getCursorPos()
term.setCursorPos(1, yt+1)
end
function ShowTitle(Text)
SetColorTitle()
term.setCursorPos(12, 1)
Show(Text)
SetColorDeflt()
end
function ShowMenu(Text)
term.write(Text)
local xt, yt = term.getCursorPos()
for i = xt, 51 do
term.write(" ")
end
term.setCursorPos(1, yt+1)
end
function ShowWarning(Text)
SetColorWarn()
term.setCursorPos(10, 19)
term.write(" "..Text.." ")
SetColorDeflt()
end
function SaveData()
local file = fs.open("shipdata.txt", "w")
file.writeLine(textutils.serialize(SData))
file.close()
end
function ReadData()
local file = fs.open("shipdata.txt", "r")
SData = textutils.unserialize(file.readAll())
file.close()
end
function Explode(d, p)
local t, ll
t = {}
ll = 0
if(#p == 1) then return {p} end
while true do
l = string.find(p ,d, ll, true)
if l ~= nil then
table.insert(t, string.sub(p, ll, l-1))
ll = l+1
else
table.insert(t, string.sub(p, ll))
break
end
end
return t
end
function ShowDirection()
if SData.Direction == 1 then
Show(" Direction = Up")
elseif SData.Direction == 2 then
Show(" Direction = Down")
elseif SData.Direction == 0 then
Show(" Direction = Front")
elseif SData.Direction == 180 then
Show(" Direction = Back")
elseif SData.Direction == 90 then
Show(" Direction = Left")
elseif SData.Direction == 255 then
Show(" Direction = Right")
end
end
function CalcRealDistance()
if IsInHyper then
RealDistance = SData.Distance * 100
MinimumDistance = 1
JumpCost = (1000 * Weight) + (1000 * SData.Distance)
else
if SData.Direction == 1 or SData.Direction == 2 then
MinimumDistance = GUp + GDown
RealDistance = SData.Distance + MinimumDistance
elseif SData.Direction == 0 or SData.Direction == 180 then
MinimumDistance = GFront + GBack
RealDistance = SData.Distance + MinimumDistance
elseif SData.Direction == 90 or SData.Direction == 255 then
MinimumDistance = GLeft + GRight
RealDistance = SData.Distance + MinimumDistance
end
MinimumDistance = MinimumDistance + 1
JumpCost = (10 * Weight) + (100 * SData.Distance)
end
end
function CalcNewCoords(cx, cy, cz)
local res = {x=cx, y=cy, z=cz}
if SData.Direction == 1 then
res.y = res.y + RealDistance
elseif SData.Direction == 2 then
res.y = res.y - RealDistance
end
local dx = component.warpdriveShipController.direction("X")
local dz = component.warpdriveShipController.direction("Z")
if dx ~= 0 then
if SData.Direction == 0 then
res.x = res.x + (RealDistance * dx)
elseif SData.Direction == 180 then
res.x = res.x - (RealDistance * dx)
elseif SData.Direction == 90 then
res.z = res.z + (RealDistance * dx)
elseif SData.Direction == 255 then
res.z = res.z - (RealDistance * dx)
end
else
if SData.Direction == 0 then
res.z = res.z + (RealDistance * dz)
elseif SData.Direction == 180 then
res.z = res.z - (RealDistance * dz)
elseif SData.Direction == 90 then
res.x = res.x + (RealDistance * dz)
elseif SData.Direction == 255 then
res.x = res.x - (RealDistance * dz)
end
end
return res
end
function ShowInfo()
ShowTitle(Title)
Show("Core:")
Show(" x, y, z = "..X..", "..Y..", "..Z)
local energy = component.warpdriveShipController.energy()
Show(" Energy = "..math.floor(energy / 1000000).." % ("..energy.."EU)")
Show(" Attached players = "..component.warpdriveShipController.getAttachedPlayers())
Show("Dimensions:")
Show(" Front, Right, Up = "..GFront..", "..GRight..", "..GUp)
Show(" Back, Left, Down = "..GBack..", "..GLeft..", "..GDown)
Show(" Size = "..Weight.." blocks")
Show("Warp data:")
ShowDirection()
local dest = CalcNewCoords(X, Y, Z)
Show(" Distance = "..RealDistance.." ("..JumpCost.."EU, "..math.floor(energy/JumpCost).." jumps)")
Show(" Dest.coordinates = "..dest.x..", "..dest.y..", "..dest.z)
if SData.Summon then
Show(" Summon after = Yes")
else
Show(" Summon after = No")
end
end
function Confirm()
ShowWarning("Are you sure? (y/n)")
ev, p1, p2, p3, p4, p5 = event.pull(nil, _, ev, p1, p2, p3, p4, p5)
local char = keyboard.keys[p2]
if char == y then
return true
else
return false
end
end
function Warp()
os.sleep(1)
component.warpdriveShipController.direction(SData.Direction)
if IsInHyper then
component.warpdriveShipController.mode(2)
else
component.warpdriveShipController.mode(1)
end
component.warpdriveShipController.jump()
end
function SetDistance()
Clear()
ShowTitle("<==== Set distance ====>")
SData.Distance = 0
CalcRealDistance()
MaximumDistance = MinimumDistance + 127
if IsInHyper then
term.write("Distance * 100 (min "..MinimumDistance..", max "..MaximumDistance.."): ")
else
term.write("Distance (min "..MinimumDistance..", max "..MaximumDistance.."): ")
end
os.sleep(0.3)
SData.Distance = tonumber(term.read())
if SData.Distance == nil then SData.Distance = 1 end
if SData.Distance < MinimumDistance or SData.Distance > MaximumDistance then
SData.Distance = 1
ShowWarning("Wrong distance. Try again.")
event.pull("key")
CalcRealDistance()
else
if not IsInHyper then
SData.Distance = SData.Distance - RealDistance
end
warp.set_distance(SData.Distance)
CalcRealDistance()
end
end
function SetDirection()
local drun = true
while(drun) do
Clear()
ShowTitle("<==== Set direction ====>")
ShowDirection()
term.setCursorPos(1, 16)
SetColorTitle()
ShowMenu("Use directional keys")
ShowMenu("W/S keys for Up/Down")
ShowMenu("Enter - confirm")
SetColorDeflt()
event.pull("key")
if keycode == 200 then
SData.Direction = 0
elseif keycode == 17 then
SData.Direction = 1
elseif keycode == 203 then
SData.Direction = 90
elseif keycode == 205 then
SData.Direction = 255
elseif keycode == 208 then
SData.Direction = 180
elseif keycode == 31 then
SData.Direction = 2
elseif keycode == 28 then
drun = false
end
end
end
function SetDimensions()
Clear()
os.sleep(0.3)
ShowTitle("<==== Set dimensions ====>")
term.write(" Front ("..GFront..") : ")
GFront = tonumber(read())
term.write(" Right ("..GRight..") : ")
GRight = tonumber(read())
term.write(" Up ("..GUp..") : ")
GUp = tonumber(read())
term.write(" Back ("..GBack..") : ")
GBack = tonumber(read())
term.write(" Left ("..GLeft..") : ")
GLeft = tonumber(read())
term.write(" Down ("..GDown..") : ")
GDown = tonumber(read())
term.write("Setting dimensions...")
component.warpdriveShipController.dim_positive(GFront, GRight, GUp)
component.warpdriveShipController.dim_negative(GBack, GLeft, GDown)
end
function Summon()
Clear()
ShowTitle("<==== Summon players ====>")
local players = Explode(",", warp.get_attached_players())
for i = 1, #players do
Show(i..". "..players[i])
end
SetColorTitle()
ShowMenu("Enter player number")
ShowMenu("or press enter to summon everyone")
SetColorDeflt()
sleep(0.3)
term.write(":")
local input = read()
if input == "" then
component.warpdriveShipController.summon_all()
else
input = tonumber(input)
component.warpdriveShipController.summon(input - 1)
end
end
function JumpToBeacon()
Clear()
ShowTitle("<==== Jump to beacon ====>")
sleep(0.3)
term.write("Enter beacon frequency: ")
local freq = tostring(read())
if Confirm() then
component.warpdriveShipController.mode(4)
component.warpdriveShipCOntroller.beaconFrequency(freq)
component.warpdriveShipController.jump()
end
end
function JumpToGate()
Clear()
ShowTitle("<==== Jump to JumpGate ====>")
os.sleep(0.3)
term.write("Enter jumpgate name: ")
local name = tostring(read())
if Confirm() then
component.warpdriveShipController.mode(6)
component.warpdriveShipController.targetJumpgate(name)
component.warpdriveShipController.jump()
end
end
if fs.exists("shipdata.txt") then
ReadData()
else
SData = {
Summon = false,
Distance = 1,
Direction = 0
}
end
component.gpu.setResolution(50, 20)
SetColorDeflt()
component.getPrimary("warpdriveShipController")
if SData.Summon then
component.warpdriveShipController.summon_all()
end
GFront, GRight, GUp = component.warpdriveShipController.dim_positive()
GBack, GLeft, GDown = component.warpdriveShipController.dim_negative()
IsInHyper = component.warpdriveShipController.isInHyperspace()
X, Y, Z = component.warpdriveShipController.position()
Weight = component.warpdriveShipController.getShipSize()
CalcRealDistance()
component.warpdriveShipController.mode(1)
mainloop = true
while(mainloop) do
Clear()
ShowInfo()
term.setCursorPos(1, 15)
SetColorTitle()
ShowMenu("D - Dimensions, M - Toggle summon")
ShowMenu("S - Set Warp Data, J - Jump, G - Jump to JumpGate")
ShowMenu("B - Jump to Beacon, H -Jump to Hyperspace")
ShowMenu("C - Summon, X - Shutdown WarpCore and Exit")
SetColorDeflt()
ev, p1, p2, p3, p4, p5 = event.pull(nil, _, ev, p1, p2, p3, p4, p5)
if ev == "key_down" then
local char = keyboard.keys[p1]
if char == s then
SetDirection()
SetDistance()
SaveData()
elseif char == m then
if SData.Summon then
SData.Summon = false
else
SData.Summon = true
end
SaveData()
elseif char == d then
SetDimensions()
SaveData()
elseif char == j then
if Confirm() then
Warp()
end
elseif char == c then
Summon()
elseif char == b then
JumpToBeacon()
elseif char == g then
JumpToGate()
elseif char == h then
if Confirm() then
component.warpdriveShipController.mode(5)
component.warpdriveShipComponent.jump()
end
elseif char == x then
mainloop = false
end
end
end
if SData.Summon then
SData.Summon = false
SaveData()
end
Clear()
print("Shutting Down")
component.warpdriveShipController.mode(0)
os.sleep(0.5)
Warp Drive controller for OC
in Programming
Posted
I've taken the above codes and gotten very close to making the program work. The problem is that the main loop isn't working right. When you press a key, it either does nothing or only goes to the warp data menu. I don't know whats wrong.