Quipex icon

LaserBlast

Quipex | PRO | 01/01/13 05:59:58 PM UTC | 0 ⭐ | 307 👁️ | Never ⏰ | []
Lua |

5.48 KB

|

None

|

0 👍

/

0 👎

w,h = term.getSize()
plpos = w/2
 
--music stuff
minterval = 1
mtimer = 1
left = false
 
level = 1
score = 0
gameover=false
killc = 0
 
--x,y,dir
projlist = {}
--x,y,intvspeed,dtimer
baddylist = {}
btimer = 0
bintv = 1
utime = 0.05
bsmp = 6
powerup = 0
 
function drawHeader()
  term.setCursorPos(5, 1)
  term.write("Score: "..score)
  if score~=0 then term.write("00") end
  local lstr = "Level: "..level
  term.setCursorPos(w-#lstr-5,1)
  term.write(lstr)
end
 
function drawWorld()
  term.clear()
  drawHeader()
  drawLandscape()
  term.setCursorPos(plpos-1, h-1)
  term.write("@@@")
  for i=1,#projlist do
    local proj = projlist[i]
    term.setCursorPos(proj.x, proj.y)
    term.write("|")
  end
  for i=1,#baddylist do
    local baddy = baddylist[i]
    term.setCursorPos(baddy.x, baddy.y)
    if baddy.dtimer==0 then
      if baddy.pup then term.write("P")
      elseif baddy.frag then term.write("*")
      else term.write("O") end
    else
      term.write("#")
    end
  end
end
 
function drawLandscape()
  term.setCursorPos(1,h)
  local land = string.rep("-", w)
  term.write(land)
  local m6="                       _____________              "
  local m5="          _______     /             \\____         "
  local m4="         /       \\___/___                \\________"
  local m3="        /                \\                        "
  local m2="       /                  \\________               "
  local m1="______/                            \\______________"
  term.setCursorPos(1, h-8)
  term.write(m6)
  term.setCursorPos(1, h-7)
  term.write(m5)
  term.setCursorPos(1, h-6)
  term.write(m4)
  term.setCursorPos(1, h-5)
  term.write(m3)
  term.setCursorPos(1, h-4)
  term.write(m2)
  term.setCursorPos(1, h-3)
  term.write(m1)
end
 
function updateWorld()
  --The music stuff  
  redstone.setOutput("back", false)
  mtimer=mtimer-utime
  if mtimer<=0 then
    mtimer = minterval
    if left then
      redstone.setOutput("left", true)
      redstone.setOutput("right", false)
    else
      redstone.setOutput("left", false)
      redstone.setOutput("right", true)
    end
    left = not left
  end
 
  local i=1
  while i<=#projlist do
    projlist[i].y = projlist[i].y+projlist[i].dir
    if projlist[i].y < 0 or projlist[i].y > h-1 then
      table.remove(projlist,i)
      i=i-1
    end
    i=i+1
  end
  i=1
  while i<=#baddylist do
    local baddy = baddylist[i]
    baddy.timer=baddy.timer+utime
 
    if baddy.y==h-1 and math.abs(baddy.x-plpos)<2 then
      if baddy.pup then powerup = 10
      else
        gameover = true 
        redstone.setOutput("back", true)
      end
    end
 
    j=1
    while j<=#projlist do
      local proj = projlist[j]
      if baddy.x==proj.x and math.abs(baddy.y-proj.y)<2
      and baddy.dtimer==0 then
        baddy.dtimer = 0.5
        table.remove(projlist,j)
        j=j-1
        score=score+5
        redstone.setOutput("back", true)
        killc=killc+1
        if killc>5+(level*5) and level<10 then levelUp() end
   
        --Adds fragments
        if math.random(1, 5) == 2 and not baddy.frag then
          table.insert(baddylist, {
            x = baddy.x-1,
            y = baddy.y,
            pup = false,
            frag = true,
            timer = 0,
            dtimer = 0,
            speed = baddy.speed/2
          })
          table.insert(baddylist, {
            x = baddy.x+1,
            y = baddy.y,
            pup = false,
            frag = true,
            timer = 0,
            dtimer = 0,
            speed = baddy.speed/2
          })
        end
      end
      j=j+1
    end
    
    if baddy.timer>baddy.speed and baddy.dtimer==0 then
      baddy.y=baddy.y+1
      baddy.timer = 0
      if baddy.y==h then
        table.remove(baddylist,i)
        i=i-1
        score=score-1
      end
    elseif baddy.dtimer>0 then
      baddy.dtimer=baddy.dtimer-utime
      if baddy.dtimer<=0 then
        table.remove(baddylist,i)
        i=i-1
      end
    end    
    i=i+1
  end  
  btimer=btimer+utime
  if btimer > bintv then
    table.insert(baddylist, {
      x = math.random(w/4, 3*(w/4)),
      y = 1,
      speed = utime*bsmp,
      timer = 0,
      dtimer = 0,
      pup = math.random(1,20)==5,
      frag = false
    })
    btimer=0
  end
end
 
function levelUp()
  level=level+1
  bintv=bintv-0.10
  bsmp=bsmp-0.5
  killc=0
  minterval=minterval-0.10
end
 
function updatePlayer(key)
  if powerup>0 then
    powerup = powerup-utime
  end
 
  if key==203 and plpos>1 then
    plpos=plpos-1
  elseif key==205 and plpos<w then
    plpos=plpos+1
  elseif key==57 then
    if powerup>0 then
      table.insert(projlist, {
        dir = -1,
        x = plpos+1,
        y = h-2
      })
      table.insert(projlist, {
        dir = -1,
        x = plpos-1,
        y = h-2
      })
    else
      table.insert(projlist, {
        dir = -1,
        x = plpos,
        y = h-2
      })
    end
  end
end
 
local wtimer os.startTimer(utime)
while not gameover do
  local e, v = os.pullEvent()
 
  if e=="timer" then
    updateWorld()
    wtimer = os.startTimer(utime)
  elseif e=="key" then
    if v==28 then break end
    updatePlayer(v)
  end
  drawWorld()
end
 
term.setCursorPos(plpos-1, h-1)
term.write("###")
local go = "Game Over!"
term.setCursorPos(w/2 - #go/2, 10)
term.write(go)
term.setCursorPos(1,h)
sleep(5)
redstone.setOutput("back", false)
term.clear()

Comments