-- title: einhander -- author: pixelbath -- desc: one-handed -- script: lua seed=12345 player={ x=20, y=50, inv=0, show=1, fire=0, gun_down=0, gun_anim=0, gun_held=0, } gunsprites={ 292, -- vulcan 294, -- cannon 296, -- spreader 298, -- wasp 300, -- grenade 302, -- hedgehog } gunnames={ {324, "V", "ULCAN"}, {325, "C", "ANNON"}, {326, "S", "PREADER"}, {327, "W", "ASP"}, {328, "G", "RENADE"}, {329, "H", "EDGEHOG"}, } vulcanMuzzleSprites={ 264, 266, 280 } shellParticles={} -- particles are just white pixels by default for i=1,15 do table.insert(shellParticles, {x=0,y=0,vx=0,vy=0,age=0,dieAt=0,color=12,idx=0,isPixel=true}) end particlePointer=1 -- points at the next particle to be spawned weaponBgSize=16--12 weaponBgTimer=0 weaponAmmo=3000 p_bullets = {} p_big_bullets = {} multiplier = 12 multiplier_sub = 0 multiplier_tick = 0 score = 25000 t=0 math.randomseed(seed) function drawParallelogram(x, y, w, h, skewpx, color) tri(x+skewpx, y, x+w, y+h, x, y+h, color) tri(x+skewpx, y, x+w, y+h, x+w+skewpx, y, color) end function spawnPixelParticle(x, y, vx, vy, age, dieAt, color) local p = shellParticles[particlePointer] p.x = x p.y = y p.vx = vx p.vy = vy p.age = age p.dieAt = dieAt p.color = color p.isPixel = true particlePointer = particlePointer + 1 if particlePointer > 15 then particlePointer = 1 end end function spawnSpriteParticle(x, y, vx, vy, age, dieAt, index) local p = shellParticles[particlePointer] p.x = x p.y = y p.vx = vx p.vy = vy p.age = age p.dieAt = dieAt p.idx = index p.isPixel = false particlePointer = particlePointer + 1 if particlePointer > 15 then particlePointer = 1 end end function drawPlayer() if (player.show) then -- arm if player.gun_down then spr(260, player.x+12, player.y+11, 0, 1, 0, 0, 2, 1) else spr(260, player.x+12, player.y-2, 0, 1, 2, 0, 2, 1) end -- ship spr(256, player.x, player.y, 0, 1, 0, 0, 4, 2) end -- draw regular bullets for key,val in ipairs(p_bullets) do spr(262, val.x, val.y, 0) end -- custom routines depending on gun held if player.gun_held > 0 then local gunsprite = gunsprites[player.gun_held] local gunpos = player.y - 2 if player.gun_down then gunsprite = gunsprite + 16 gunpos = gunpos + 14 end spr(gunsprite, player.x+12, gunpos, 0, 1, 0, 0, 2, 1) -- vulcan if player.gun_held == 1 then local flipfire = 0 local muzzleIdx = math.random(0,3) if math.random(1, 2) == 2 then flipfire = 2 end if player.fire == 0 then player.fire = 2 else player.fire = player.fire - 1 end -- begin dakka if muzzleIdx > 0 then if player.gun_down then spr(vulcanMuzzleSprites[muzzleIdx], player.x + 27, player.y + 14, 0, 1, flipfire, 0, 2, 1) else spr(vulcanMuzzleSprites[muzzleIdx], player.x + 28, player.y - 2, 0, 1, flipfire, 0, 2, 1) end end if t % 10 == 0 then local randFactor = math.random(10,100) local spawnOffsetY = 1 local lineStart = math.random(player.x+20, 260) if player.gun_down then spawnOffsetY = 18 -- vulcan tilts downward so we get to do trig! yay! lineStart = lineStart - player.x local angle = 8 local radius2 = lineStart+38 local c = math.cos(angle * math.pi / 180) local s = math.sin(angle * math.pi / 180) line(c * lineStart + player.x + 18, s * lineStart + player.y + 17, c * radius2 + player.x + 18, s * radius2 + player.y + 17, 14) else line(lineStart, player.y+1, lineStart+40, player.y+1, 14) end -- shells spawnPixelParticle(player.x+14, player.y+spawnOffsetY, -0.2, -0.6 + (randFactor / 100), 0, 50, 15) end -- update shells with light gravity for i=1,#shellParticles do local p = shellParticles[i] p.vy = p.vy + 0.1 end end end for i=1,#shellParticles do local p = shellParticles[i] if p.age < p.dieAt then if p.isPixel then pix(p.x, p.y, p.color) else spr(p.idx, p.x, p.y) end end end end function drawUI() -- weapon bg -- spr(322, 4, 114, 0, 1, 0, 0, 1, 2) -- rect(12, 114, 8, 16, 6) -- spr(323, 20, 114, 0, 1, 0, 0, 1, 2) drawParallelogram(6, 115, weaponBgSize, 12, 6, 6) -- selected weapon if player.gun_held > 0 then local lettersprite = gunnames[player.gun_held][1] local guntext = gunnames[player.gun_held][3] spr(lettersprite, 14, 118, 0, 1) print(guntext, 24, 122, 12, true, 1, true) print(weaponAmmo, 12, 129, 12, true, 1, true) end -- multiplier -- TODO: need to do multipliers over 10, so the X needs to move left when that happens spr(340, 164, 114, 0) --spr(340 + multiplier, 172, 113, 0) spr(330, 180, 114, 0, 1, 0, 0, 4, 1) spr(331, 212, 114, 0, 1, 0, 0, 3, 1) spr(334, 236, 114, 0, 1) if multiplier_sub > 0 then for i = 1, multiplier_sub do spr(335, 177 + (i * 6), 114, 0) end end -- score local scorestring = tostring(score) for i = 1, #scorestring do local char = scorestring:sub(i, i) local numsprite = 340 + tonumber(char) -- this is a hack because I ordered the numbers weirdly if char == "0" then numsprite = 350 end spr(numsprite, (230 - (8 * #scorestring)) + (i * 8), 123, 0) end end -- 1xxxxxxxxxxx -- 0xxxxxxxxxxx -- 0xxxxxxxxxxx -- 1xxxxxxxxxxx function drawWater(waterHeight) for i=0,waterHeight-1 do local row = (135 - i - waterHeight) * 120 local rowDest = (135 + i - waterHeight + 1) * 120 memcpy(rowDest, row, 120) end end function drawDebug() -- print("p.gdown: " .. tostring(player.gun_down), 5, 5, 12, true, 1, true) -- print("spr: " .. tostring(vulcanMuzzleSprites[player.fire + 1]), 5, 13, 12, true, 1, true) end function update() if btn(0) then if player.y > 0 then player.y=player.y-2 end end if btn(1) then if player.y < 120 then player.y=player.y+2 end end if btn(2) then if player.x > 1 then player.x=player.x-2 end end if btn(3) then if player.x < 216 then player.x=player.x+2 end end if btnp(4) then player.gun_held = 1 player.gun_down = not player.gun_down end if btn(5) then --if player.gun_held == 0 then if player.fire == 0 then player.fire = 5 table.insert(p_bullets, {x=player.x+10, y=player.y+2}) else player.fire = player.fire - 1 end --end end for key,val in ipairs(p_bullets) do p_bullets[key].x = p_bullets[key].x + 8 if val.x > 240 then table.remove(p_bullets, key) end end for i=1,#shellParticles do local p = shellParticles[i] p.x = p.x + p.vx p.y = p.y + p.vy p.age = p.age + 1 end t=t+1 end function TIC() update() cls(0) drawPlayer() -- drawWater(10) drawUI() drawDebug() end