PICO-8 Llama Game - Day 3
    I forgot to Ctrl + S when closing my code last night which meant that I had to re-write everything I wrote yesterday, though fortunately it didn’t take too long. If there was one thing I could change about Pico8, it would be a save reminder and/or a warning on shut-down.
Worked on the animation again today. I fixed the animation bug and now use an index/counter and when the index reaches the length of the array of sprites that animating through, it stops. I find it interesting how Lua starts indexing arrays at 1, not 0, it’s tripped me up a couple of times so far. My code looked something like this:
llama = {x=100, y=100, s=16}
spitleft = {16, 17, 18, 16}
index = 1
animation_speed = 0.1
animation_timer = 0
function _update()
  if btn(➡️) then
    llama.x = llama.x + 1
    llama.s = 32
  end
  if btn(⬅️) then
    llama.x = llama.x - 1
    llama.s = 16
  end
  if btn(⬇️) then
    llama.y = llama.y + 1
  end
  if btn(⬆️) then
    llama.y = llama.y - 1
  end
  if btnp(❎) then
    spit()
  end
end
function spit()
  llama.s = spitleft[index]
  index = index + 1
  if index > #spitleft then
    index = 1
  end
end
function _draw()
  cls()
  map(0, 0, 0, 0, 128, 32)
  spr(llama.s, llama.x, llama.y)
end After this I still had a little time, so I added for the llama to also spit when facing right, and the spit travels in the right direction. I learned about ‘dx’ or ‘change in position’ today to be able to alter the direction and speed of the spit. At first I had a funny issue that if my llama changed direction, that every spit changed direction with it, but fixed that one quite quickly. By the end of the day my code looked something like this:
spitleft = {16, 17, 18, 16}
spitright = {32, 33, 34, 32}
index = 0
animation_speed = 0.5
animation_timer = 0
spits = {}
function _update()
    if btn(➡️) then
        llama.x = llama.x + 1
        llama.left = false
        llama.s = 32
    end
    if btn(⬅️) then
        llama.x = llama.x - 1
        llama.left = true
        llama.s = 16
    end
    if btn(⬇️) then
        llama.y = llama.y + 1
    end
    if btn(⬆️) then
        llama.y = llama.y - 1
    end
    if btnp(❎) then
        spit()
    end
    for i = #spits, 1, -1 do
        local llamaspit = spits[i]
        llamaspit.x = llamaspit.x + llamaspit.dx
        if llamaspit.x > 128 then
            del(spits, i)
        end
    end
    if llama.animating then
        if llama.left then
            llama.s = spitleft[index]
        else
            llama.s = spitright[index]
        end
        index = index + 1
        if index > #spitleft then
            index = 1
            if llama.left then
                llama.s = 16
            else
                llama.s = 32
            end
            llama.animating = false
        end
    end
end
function spit()
    llama.animating = true
    shootspit()
end
function shootspit()
    add(spits, {x=llama.x, y=llama.y, dx=llama.left and -1 or 1})
end
function _init()
end
function _draw()
    cls()
    map(0, 0, 0, 0, 128, 32)
    spr(llama.s, llama.x, llama.y)
    for llamaspit in all(spits) do
        spr(3, llamaspit.x, llamaspit.y)
    end
end There’s an issue that the spit isn’t moving while the llama is, but it’s late enough that it’s now a tomorrow problem.