123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- -- 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
|