Jump to content
  • Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal

RedStine

Members
  • Content Count

    1
  • Joined

  • Last visited

Posts posted by RedStine

  1. 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)
    
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use and Privacy Policy.