crabb

パコパコドン

Oct 28th, 2020 (edited)
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 35.36 KB | None | 0 0
  1. pico-8 cartridge // http://www.pico-8.com
  2. version 18
  3. __lua__
  4. -- main
  5. -- > by suwacrab
  6. _init = function()
  7.     -- clear wram
  8.     memset(mem_wrk,0x1b00)
  9. end
  10.  
  11. _update60 = function()
  12.     state_updt()
  13. end
  14.  
  15. _draw = function()
  16.     state_draw()
  17.     -- print cpu usage
  18.     local cpu = shl(stat(0),6)
  19.     cpu = tostr(cpu,true)
  20.     print(cpu,0,0,7)
  21. end
  22. -->8
  23. -- data
  24. -- > memory
  25. mem_chr = 0x0000 --> 0x2000
  26. mem_map = 0x2000 --> 0x1000
  27. mem_flg = 0x3000 --> 0x0100
  28. mem_bgm = 0x3100 --> 0x0100
  29. mem_sfx = 0x3200 --> 0x1100
  30. mem_wrk = 0x4300 --> 0x1b00
  31. mem_sav = 0x5e00 --> 0x0100
  32. mem_dst = 0x5f00 --> 0x0040
  33. mem_hst = 0x5f40 --> 0x0040
  34. mem_gpi = 0x5f80 --> 0x0080
  35. mem_fb0 = 0x6000 --> 0x2000
  36.  
  37. mem_fb1 = mem_wrk
  38.  
  39. -- > lookup tables
  40. lut_mesh = {
  41. [0]=
  42.     0x8000,0x8020,0xa020,0xa0a0;
  43.     0xa4a0,0xa4a1,0xa5a1,0xa5a5;
  44.     0xe5a5,0xe5b5,0xf5b5,0xf5f5;
  45.     0xfdf5,0xfdf7,0xfff7,0xffff;
  46. }
  47.  
  48. state_name_lut = {
  49.     title = 0;
  50.     menu = 1;
  51.     game = 2;
  52. }
  53.  
  54. state_srct_lut = {}
  55.  
  56. -- functions
  57. fsin = function(a)
  58.     a = shr(a,16)/0x1.0000
  59.     return -sin(a)
  60. end
  61.  
  62. fcos = function(a)
  63.     return fsin(a + 0x4000)
  64. end
  65.  
  66. clmp = function(x,a,b)
  67.     return
  68.         x<a and a
  69.         or x>b and b
  70.         or x
  71. end
  72.  
  73. -- keiki
  74. keiki = {}
  75. keiki.__index = keiki
  76. -->8
  77. -- keiki
  78. --|==== function reference ===|
  79. --[[
  80.  * > function list:
  81.  * keiki.new(len,def): creates new list w/ length `len` and optional callback `def`
  82.  * keiki:add(mode,f) : adds new object w/ mode `mode` and optional callback `f`
  83.  * keiki:del(id,f)   : deletes object [id] and uses optional callback `f`
  84.  * keiki:iter(f)     : iterates through pool with callback `f`
  85.  *
  86.  * > structure info:
  87.  * every pool has 4 attributes:
  88. ・ス> objs: the (0-indexed!) array of objects
  89. ・ス> len: the length of objects
  90. ・ス> last: a pointer to the last object in the
  91.         pool. this is used for adding and removing
  92.         objects from the pool's free list
  93. ・ス> alive: the number of alive objects
  94.  * every object has 4 attributes, but you're free to add more to them:
  95. ・ス> mode: the object's "type". you can use this
  96.      for using different types of objects inside one pool.
  97. ・ス> dead: whether or not the object's alive.
  98. ・ス> id: the object's index in the array.
  99. ・ >スnext: a pointer to the next object. used for the pool's free
  100.     list.
  101. ]]
  102.  
  103.  
  104. --|==== functions =============|
  105. -- * > creates a new object pool
  106. -- * ・> len: length of army, must be under 0x10000.
  107. -- * ・> def: callback on every object. 1st is the list,2nd is index.
  108. keiki.new = function(len,def)
  109.  local may = { objs = {},len = len,last = 0,alive = 0 }
  110.  for i = 0,len-1 do
  111.      may.objs[i] = { mode=0,dead=true,id=i,next=i+1 }
  112.      if def then def(may,i,may.objs[i]) end
  113.  end
  114.  may.objs[len-1].next = 0xffff
  115.  
  116.  return setmetatable(may,keiki)
  117. end
  118.  
  119. --> adds a new object to pool.
  120. --  > may: the list to add to
  121. --  > mode: the type of object
  122. --  > f: the callback on the new object. works the same as keiki.new's callback.
  123. keiki.add = function(may,mode,f)
  124.  -- if there's no space, return nil.
  125.  if may.alive == may.len then return end
  126.  -- find the nearest object, reset it's attributes
  127.  local hani = may.objs[may.last]
  128.  hani.dead = false
  129.  hani.mode = mode or 0;
  130.  if f then f(may,hani.id,hani) end
  131.  -- make sure this object will be the next free object once it's dead
  132.  may.last = hani.next
  133.  -- increment the alive count, then return the new object.
  134.  may.alive = may.alive+1
  135.  return hani;
  136. end
  137.  
  138. --> deletes object [id] from the pool.
  139. --  > may: the list to remove from
  140. --  > id: the id of the object to remove.
  141. --  > f: callback on the deleted object. works the same as keiki.new's callback.
  142. keiki.del = function(may,id,f)
  143.  -- if the deleted object doesn't exist, return nil.
  144.  local hani = may.objs[id]
  145.  if(hani==nil) then return end
  146.  if(hani.dead) then return end
  147.  -- reset variables.
  148.  hani.dead = true
  149.  if f then f(may,hani.id,hani) end
  150.  -- hani's next object should be the last free object
  151.  -- the new free object should be hani
  152.  hani.next = may.last
  153.  may.last = id
  154.  -- decrement alive counter
  155.  may.alive = may.alive-1
  156.  return hani
  157. end
  158.  
  159. --> iterates through pool with the callback f.
  160. -- > may: the pool to iterate through
  161. -- > f: the callback to use.
  162. -- >> 1st argument is the list, 2nd is the id, 3rd is the current object.
  163. keiki.iter = function(may,f)
  164.  for i = 0,may.len-1 do
  165.   f(may,i,may.objs[i])
  166.  end
  167. end
  168. -->8
  169. -- game state
  170. game = {
  171.     cur_state = 0
  172. }
  173. state_swap = function(new)
  174.     game.cur_state = new
  175. end
  176.  
  177. state_updt = function()
  178.     local state = game.cur_state
  179.     state_srct_lut[state]:updt()
  180. end
  181.  
  182. state_draw = function()
  183.     local state = game.cur_state
  184.     state_srct_lut[state]:draw()
  185. end
  186.  
  187. -- state objs
  188. state_title = {
  189.     t = 0;
  190.     swap_flag = false;
  191.     updt = function(state)
  192.         if state.t == 15 then
  193.             state.swap_flag = true
  194.         end
  195.         state.t += 1
  196.     end;
  197.     draw = function(state)
  198.         cls(0)
  199.         if state.swap_flag then
  200.             state_swap(state_name_lut.menu)
  201.         end
  202.     end;
  203. }
  204.  
  205. state_menu = {
  206.     t = 0;
  207.     updt = function() end;
  208.     draw = function()
  209.         cls(0)
  210.         state_swap(state_name_lut.game)
  211.     end;
  212. }
  213. state_game = {
  214.     -- vars
  215.     did_init = false;
  216.     t = 0;
  217.     -- misc
  218.     fx_objs = nil;
  219.     fx_updt = function(state)
  220.         local objs = state.fx_objs
  221.         objs:iter(function(m,i,o)
  222.             if o.dead then return end
  223.             local spd,ang = o.spd,o.ang
  224.             local px,py = o.px,o.py
  225.             local t = o.t
  226.             -- > 00h: orb lo
  227.             if o.mode == 0 then
  228.                 local dt = shr(t,1)
  229.                 -- move
  230.                 local vx,vy = 0,0
  231.                 local x,y = px,py
  232.                 px += fcos(ang) * spd
  233.                 py += fsin(ang) * spd
  234.                 o.vx,o.vy = vx,vy
  235.                 o.px,o.py = px,py
  236.                 spd -= 0.2
  237.                 if(spd<0) spd=0
  238.                 o.spd = spd
  239.                 -- handle removal
  240.                 if dt >= 4 then
  241.                     objs:del(i)
  242.                 end
  243.             -- > 01h: star
  244.             elseif o.mode == 1 then
  245.                 py += o.spd
  246.                 o.px,o.py = px,py
  247.                 if(py >= 128+32) m:del(i)
  248.             -- > 02h: explosion
  249.             elseif o.mode == 2 then
  250.                 px += fcos(ang) * spd
  251.                 py += fsin(ang) * spd
  252.                 spd = clmp(spd-.1,0,32)
  253.                 o.spd = spd
  254.                 o.px,o.py = px,py
  255.                 -- > delete
  256.                 if(t>=16) objs:del(i)
  257.             -- > 03h: debris 1
  258.             elseif ({[3]=1,[4]=1,[5]=1})[o.mode] then
  259.                 px += fcos(ang) * spd
  260.                 py += fsin(ang) * spd
  261.                 spd = clmp(spd-.01,0,32)
  262.                 o.spd = spd
  263.                 o.px,o.py = px,py
  264.                 if(t>=140) objs:del(i) 
  265.             end
  266.         end)
  267.     end;
  268.     fx_draw = function(state)
  269.         local objs = state.fx_objs
  270.         objs:iter(function(m,i,o)
  271.             if o.dead then return end
  272.             local px,py = o.px,o.py
  273.             local t = o.t
  274.             local odd = t%2==0
  275.             -- > 00h: orb lo
  276.             if o.mode == 0 then
  277.                 local dt = shr(t,1)
  278.                 if(odd) spr(56+dt,px-4,py-4)
  279.             -- > 01h: star
  280.             elseif o.mode == 1 then
  281.                 if(odd) spr(1,px-4,py-4)
  282.             -- > 02h: explosion
  283.             elseif o.mode == 2 then
  284.                 local dt = flr(shr(t,2))
  285.                 if(odd) then
  286.                     spr(192 + dt*2,px-8,py-8,2,2)
  287.                 end
  288.             -- > 03h: debris 1
  289.             elseif o.mode == 3 then
  290.                 local dt = flr(shr(t,2))%4
  291.                 spr(80+dt,px-4,py-4)
  292.             -- > 04h: debris 2
  293.             elseif o.mode == 4 then
  294.                 local dt = flr(shr(t,2))%4
  295.                 spr(84+dt,px-4,py-4)
  296.             -- > 05h: debris 3
  297.             elseif o.mode == 5 then
  298.                 local dt = flr(shr(t,2))%4
  299.                 spr(96+dt,px-4,py-4)
  300.             end
  301.             o.t = t+1
  302.         end)
  303.     end;
  304.     fx_addbomb = function(state,x,y,spd,ang)
  305.         local objs = state.fx_objs
  306.         objs:add(2,function(m,i,o)
  307.             o.px,o.py = x,y
  308.             o.spd = spd
  309.             o.ang = ang or 0
  310.             o.t = 0
  311.         end)
  312.     end;
  313.     -- player
  314.     p1 = {};
  315.     p2 = {};
  316.     p1_shot = nil;
  317.     p2_shot = nil;
  318.     plr_updt = function(state)
  319.         local p1 = state.p1
  320.         state:plr_updtlock()
  321.         state:plr_updtshot()
  322.         state:plr_move()
  323.         if(not p1.enter) state:plr_shoot()
  324.     end;
  325.     plr_updtlock = function(state)
  326.         local p1 = state.p1
  327.         local enmy = state.enm_objs
  328.         -- > lock vars
  329.         local lock_enmy = p1.lock_enmy
  330.         -- > don't lock dead foes
  331.         if lock_enmy then
  332.             if enmy.objs[lock_enmy].dead then
  333.                 lock_enmy = nil
  334.             end
  335.         end
  336.         -- > set vars
  337.         p1.lock_enmy = lock_enmy
  338.     end;
  339.     plr_updtshot = function(state)
  340.         local p1 = state.p1
  341.         local p1_shot = state.p1_shot
  342.         p1_shot:iter(function(m,i,o)
  343.             if(o.dead) return;
  344.             if o.mode == 0b00000000 then
  345.                 local x,y = o.px,o.py
  346.                 local vx,vy = o.vx,o.vy
  347.                 local ang = o.ang
  348.                 vx = fcos(ang) * o.spd
  349.                 vy = fsin(ang) * o.spd
  350.                 o.vx,o.vy = vx,vy
  351.                 x += vx; y += vy;
  352.                 o.px,o.py = x,y
  353.                 o.t += 1
  354.                 -- oob check
  355.                 local ox = x>=192 or x<-64
  356.                 local oy = y>=192 or y<-64
  357.                 if(ox or oy) then
  358.                     p1_shot:del(i)
  359.                 end
  360.             end
  361.         end)
  362.     end;
  363.     plr_shoot = function(state)
  364.         local p1 = state.p1
  365.         local p1_shot = state.p1_shot
  366.         -- > update presses
  367.         if btn(4) then
  368.             if not p1.shot_press then
  369.                 if p1.power == 0 then
  370.                     if p1.shota_timer <= 0 then
  371.                         p1.shota_timer = 0x10
  372.                     end
  373.                 end
  374.                 p1.shot_press = true
  375.             else
  376.                 -- handle focus
  377.                 if p1.shota_timer <= -8 then
  378.                     p1.shot_focus = true
  379.                 end
  380.             end
  381.         end
  382.         if not btn(4) then
  383.             p1.shot_focus = false
  384.             p1.shot_press = false
  385.             p1.focus_timer = 0
  386.         end
  387.         -- > update shots
  388.         do
  389.             if p1.power == 0 then
  390.                 if p1.shota_timer <= -8 then
  391.                     if p1.shot_focus then
  392.                         if p1.focus_timer%6==0 then
  393.                             for a = -1,1,2 do
  394.                                 p1_shot:add(
  395.                                     0b00000000,
  396.                                     function(m,i,o)
  397.                                         local spread = (a*4)
  398.                                         local shtspr = p1.focus_timer%16
  399.                                         if(p1.vx~=0) spread *= .5
  400.                                         o.t = 0
  401.                                         o.ang =
  402.                                             (shtspr*0x0040*a) - 0x4000
  403.                                         o.ang = band(o.ang,0xffff)
  404.                                         o.spd = 8
  405.                                         o.px = p1.x + spread
  406.                                         o.py = p1.y
  407.                                         spr(56,p1.x + spread-4,o.py)
  408.                                         sfx(0,.1)
  409.                                     end
  410.                                 )
  411.                             end
  412.                         end
  413.                         p1.focus_timer += 1
  414.                     end
  415.                 elseif p1.shota_timer <= 0 then
  416.                 elseif p1.shota_timer%4==0 then
  417.                     -- shoot middle shot
  418.                     local shf = 0x1.8 - p1.shota_timer/12
  419.                     shf *= 0x0c00
  420.                     local spd = 8
  421.                     p1_shot:add(0b00000000,
  422.                         function(m,i,o)
  423.                             o.t = 0
  424.                             o.ang = 0xc000
  425.                             o.spd = spd
  426.                             o.px,o.py = p1.x,p1.y-8
  427.                             spr(56,o.px-4,o.py-4)
  428.                         end
  429.                     )
  430.                     -- > shoot side shots
  431.                     for a = -1,1,2 do
  432.                         p1_shot:add(
  433.                             0b00000000,
  434.                             function(m,i,o)
  435.                                 local spread = (a*4)
  436.                                 if(p1.vx~=0) spread *= .5
  437.                                 o.t = 0
  438.                                 o.ang = shf*a - 0x4000
  439.                                 o.ang = band(o.ang,0xffff)
  440.                                 o.spd = spd
  441.                                 o.px = p1.x + spread
  442.                                 o.py = p1.y
  443.                                 spr(
  444.                                     56,
  445.                                     (p1.x + spread*1)-4,
  446.                                     o.py-4)
  447.                             end
  448.                         )
  449.                     end
  450.                     sfx(0)
  451.                 end
  452.             end
  453.         end
  454.         -- > update timers
  455.         p1.shota_timer -= 1
  456.         if p1.shota_timer < -64 then
  457.             p1.shota_timer = -64
  458.         end
  459.     end;
  460.     plr_move = function(state)
  461.         local p1 = state.p1
  462.         if p1.enter then
  463.             local et = p1.enter_time
  464.             p1.y -= et/3
  465.             et -= .15
  466.             if et <= -3 then
  467.                 p1.enter = false
  468.             end
  469.             p1.enter_time = et
  470.         else
  471.             local spd = 1
  472.             if p1.shot_focus then
  473.                 spd = .2
  474.             end
  475.             local vx,vy = 0,0
  476.             if(btn(0)) vx -= spd
  477.             if(btn(1)) vx += spd
  478.             if(btn(2)) vy -= spd
  479.             if(btn(3)) vy += spd
  480.             -- > move
  481.             p1.vx,p1.vy = vx,vy
  482.             p1.x += vx
  483.             p1.y += vy
  484.         end
  485.     end;
  486.     plr_draw = function(state)
  487.         local p1 = state.p1
  488.         state:plr_drawlock()
  489.         state:plr_drawstat()
  490.         state:plr_drawshot()
  491.         state:plr_drawship()
  492.     end;
  493.     plr_drawlock = function(state)
  494.         local p1 = state.p1
  495.         local enmy = state.enm_objs
  496.         local lock_enmy = p1.lock_enmy
  497.         -- draw lockon
  498.         if lock_enmy then
  499.             -- > reticle
  500.             local obj = enmy.objs[lock_enmy]
  501.             local t = state.t
  502.             local dt = band(shr(t,1),3)
  503.             local px,py = obj.px,obj.py
  504.             local indx = 60
  505.             if t%2==0 then
  506.                 indx += dt
  507.                 spr(indx,px-4,py-4)
  508.             else
  509.                 indx = 14 - (dt*2)
  510.                 spr(indx,px-8,py-8,2,2)
  511.             end
  512.             -- > text
  513.             if t%2==0 then
  514.                 indx = 2
  515.                 spr(indx,px-32,py-16,3,1)
  516.             end
  517.         end
  518.     end;
  519.     plr_drawstat = function(state)
  520.         local p1 = state.p1
  521.         local x,y = 0,8
  522.         -- > draw lives
  523.         if p1.lives > 0 then
  524.             for i = 1,p1.lives do
  525.                 spr(21,x,y)
  526.                 x += 8
  527.             end
  528.         end
  529.         -- > draw bombs
  530.         x,y = 0,y+8
  531.         if p1.bombs > 0 then
  532.             for i = 1,p1.bombs do
  533.                 spr(22,x,y)
  534.                 x += 8
  535.             end
  536.         end
  537.     end;
  538.     plr_drawship = function(state)
  539.         local p1 = state.p1
  540.         -- > get pos & index
  541.         local x,y = p1.x,p1.y
  542.         local vx,vy = p1.vx,p1.vy
  543.         local indx = 32
  544.         if(vy<0) indx = 34
  545.         if(vx<0) indx = 36
  546.         if(vx>0) indx = 36 + 2
  547.         if(p1.enter) indx = 34
  548.         -- > draw afterburner
  549.         if state.t%2==0 then
  550.             local x = x - vx
  551.             local y = y - vy
  552.             local indx = 56
  553.             local t = shr(state.t,1)
  554.             indx += (t%4)
  555.             y -= vy*(t%4)
  556.             x -= vx*(t%4)
  557.             spr(indx,x-4,y+2)
  558.             palt()
  559.         end
  560.         -- > draw ship
  561.         spr(
  562.             indx,x-8,y-8,
  563.             2,2
  564.         )
  565.     end;
  566.     plr_drawshot = function(state)
  567.         local p1 = state.p1
  568.         local p1_shot = state.p1_shot
  569.         p1_shot:iter(function(m,i,o)
  570.             if o.dead then return end
  571.             if o.mode == 0b00000000 then
  572.                 local ang = o.ang
  573.                 local x,y = o.px,o.py
  574.                 local indx = 40
  575.                 local fx = false
  576.                 local rnd_ang = shr(ang + 0x0800,12)
  577.                 indx += rnd_ang%8
  578.                 if(ang<0) fx=true
  579.                 spr(
  580.                     indx,x-4,y-4,
  581.                     1,1,
  582.                     fx,fx
  583.                 )
  584.             end
  585.         end)
  586.     end;
  587.     -- enemy
  588.     stg_time = 0;
  589.     stg_index = 0;
  590.     enm_shot = nil;
  591.     enm_obj = nil;
  592.     enm_coro = cocreate(function(state)
  593.         local t = state.stg_time
  594.         local objs = state.enm_objs
  595.         local function fwait(f)
  596.             f = f or 1
  597.             for i = 1,f do
  598.                 yield()
  599.                 t += 1
  600.                 state.stg_time = t
  601.             end
  602.         end
  603.         -- main coroutine
  604.         -- > stage 1
  605.         if state.stg_index == 0 then
  606.             -- > level text
  607.             do
  608.                 local lim = 112
  609.                 for i = -lim,lim,2 do
  610.                     local s = 1
  611.                     if(i>0) s -= i/lim
  612.                     local x,y = 64 + i,64
  613.                     local oy = 8*s
  614.                     -- get color
  615.                     local clut = {
  616.                         [0]=7,15,14,13,
  617.                         5,2,1,0
  618.                     }
  619.                     local clr = clut[8-flr(s*8)]
  620.                     rectfill(0,y-oy,128,y+oy,clr)
  621.                     -- get print x
  622.                     local is = (i+lim)/(lim*2)+.5
  623.                     local px = -48 + cos(is)*64
  624.                     print("stage 1",px,y-4,0)
  625.                     print("get ready! 笙・",px+32,y+2,0)
  626.                     fwait()
  627.                 end
  628.             end
  629.             fwait(30)
  630.             -- > missiles
  631.             do
  632.                 for i = 1,50 do
  633.                     local x = 8 + rnd(112)
  634.                     local y = -16
  635.                     objs:add(0,function(m,i,o)
  636.                         o.px,o.py = x,y
  637.                         o.t = 0
  638.                         o.hp = 5
  639.                         o.hbsize = 8
  640.                         local off = (rnd()-.5)
  641.                         o.d[0] =
  642.                             0x4000 + off*0x2000
  643.                         o.d[1] = 3
  644.                     end)
  645.                     fwait(15/2)
  646.                 end
  647.             end
  648.             state.stg_index += 1
  649.         end
  650.         -- infinite loop
  651.         while true do fwait() end
  652.     end);
  653.     enm_updt = function(state)
  654.         -- > vars
  655.         local p1 = state.p1
  656.         local coro = state.enm_coro
  657.         local objs = state.enm_objs
  658.         -- > coroutine
  659.         local on,excep = coresume(coro,state)
  660.         if not on then
  661.             stop(trace(co,excep))
  662.         end
  663.         -- deal damage
  664.         objs:iter(function(m,i,o)
  665.             if o.dead then return end
  666.             local hp = o.hp
  667.             local px,py = o.px,o.py
  668.             -- > damaging
  669.             local hbsize = o.hbsize
  670.             state.p1_shot:iter(
  671.                 function(psht,ind,sht)
  672.                     if sht.dead then return end
  673.                     local x1,y1 =
  674.                         px-hbsize,py-hbsize
  675.                     local x2,y2 =
  676.                         px+hbsize,py+hbsize
  677.                     if sht.px<x2 and sht.px>=x1 then
  678.                         if sht.py<y2 and sht.py>=y1 then
  679.                             if(sht.dmg<=hp) psht:del(ind)
  680.                             hp -= sht.dmg
  681.                             p1.lock_enmy = i
  682.                             sfx(2)
  683.                         end
  684.                     end
  685.                 end
  686.             )
  687.             o.hp = hp
  688.         end)
  689.         -- update objects
  690.         objs:iter(function(m,i,o)
  691.             if o.dead then return end
  692.             local px,py = o.px,o.py
  693.             local hp = o.hp
  694.             -- > 0 - straight missile
  695.             if o.mode == 0 then
  696.                 local ang = o.d[0]
  697.                 local spd = o.d[1]
  698.                 px += fcos(ang)*spd
  699.                 py += fsin(ang)*spd
  700.                 o.px,o.py = px,py
  701.                 -- > death
  702.                 local ox = px<-64 or px>128+64
  703.                 local oy = py<-64 or py>128+64
  704.                 if ox or oy then
  705.                     m:del(o.id)
  706.                 end
  707.                 if hp <= 0 then
  708.                     for a = 0,15,4 do
  709.                         state:fx_addbomb(
  710.                             px,py,(a/4) * rnd(3),
  711.                             0x1000*(a+state.t)
  712.                         )
  713.                     end
  714.                     for a = 0,4 do
  715.                         state.fx_objs:add(3+(a%3),
  716.                             function(m,i,o)
  717.                                 o.px,o.py = px,py
  718.                                 o.ang = a*0x2000
  719.                                 o.ang += rnd()*0x1430
  720.                                 o.spd = 1 + rnd(4)
  721.                                 o.t = 0
  722.                             end
  723.                         )
  724.                     end
  725.                 end
  726.             end
  727.             -- damaging
  728.             if hp <= 0 then
  729.                 circfill(px,py,12,7)
  730.                 objs:del(i)
  731.                 sfx(1)
  732.             end
  733.         end)
  734.     end;
  735.     enm_draw = function(state)
  736.         local objs = state.enm_objs
  737.         objs:iter(function(m,i,o)
  738.             if o.dead then return end
  739.             local px,py = o.px,o.py
  740.             local odd = o.t%2==1
  741.             -- > 0 - straight missile
  742.             if o.mode == 0 then
  743.                 local ang = o.d[0]
  744.                 local indx = 64
  745.                 indx += shr(ang + 0x0800,12)
  746.                 if(o.hp==1) for i = 1,15 do pal(i,7) end
  747.                 if(o.hp!=1) odd=true
  748.                 if(odd) spr(indx,px-4,py-4)
  749.                 pal()
  750.                 o.t += 1
  751.                 -- > afterburner
  752.                 if o.t%2 == 0 then
  753.                     state.fx_objs:add(0,
  754.                         function(m,i,o)
  755.                             o.t = 0
  756.                             o.px,o.py = px,py
  757.                             o.ang,o.spd = ang+0x8000,0
  758.                         end
  759.                     )
  760.                 end
  761.             -- > 1 - raizin
  762.             elseif mode == 1 then
  763.                
  764.             end
  765.         end)
  766.     end;
  767.     -- functions
  768.     init = function(state)
  769.         if not state.did_init then
  770.             -- > player
  771.             state.p1 = {
  772.                 -- > coordinates
  773.                 x=64,y=128+32;
  774.                 vx = 0,vy=0;
  775.                 -- > stats
  776.                 lives = 2;
  777.                 bombs = 4;
  778.                 -- > entrance
  779.                 enter = true;
  780.                 enter_time = 8;
  781.                 -- > shot vars
  782.                 shota_timer = 0; -- shot a
  783.                 focus_timer = 0;
  784.                 power = 0
  785.             }
  786.             state.p1_shot = keiki.new(
  787.                 0x0080,
  788.                 function(m,i,o)
  789.                     o.px,o.py = 0,0
  790.                     o.vx,o.vy = 0,0
  791.                     o.ang,o.spd = 0,0
  792.                     o.t = 0
  793.                     o.dmg = 2
  794.                 end
  795.             )
  796.             -- > effects
  797.             state.fx_objs = keiki.new(0x0100,function(m,i,o)
  798.                 o.px,o.py = 0,0
  799.                 o.vx,o.vy = 0,0
  800.                 o.ang,o.spd = 0,0
  801.                 o.t = 0
  802.             end)
  803.             -- > enemy
  804.             state.enm_objs = keiki.new(
  805.                 0x0020,
  806.                 function(m,i,o)
  807.                     o.px,o.py = 0,0
  808.                     o.hbsize = 0
  809.                     o.hp = 0
  810.                     o.d = {}
  811.                 end
  812.             )
  813.             state.enm_shot = keiki.new(
  814.                 0x0100,
  815.                 function(m,i,o)
  816.                     o.px,o.py = 0,0
  817.                     o.vx,o.vy = 0,0
  818.                     o.ang = 0
  819.                 end
  820.             )
  821.             state.did_init = true
  822.         end
  823.     end;
  824.     star_add = function(state)
  825.         local objs = state.fx_objs
  826.         if state.t%9==0 then
  827.             objs:add(1,function(m,i,o)
  828.                 o.t = 0
  829.                 o.px = rnd(128)
  830.                 o.py = -32
  831.                 o.spd = .1+rnd()*4
  832.             end)
  833.         end
  834.     end;
  835.     updt = function(state)
  836.         -- > dither?
  837.         local pat = lut_mesh[8]
  838.         pat += 0b0.1
  839.         pat = bxor(pat,0xffff * (state.t%2))
  840.         --fillp(pat)
  841.         rectfill(0,0,128,128,0)
  842.         fillp()
  843.         -- > update
  844.         state:init()
  845.         state:plr_updt()
  846.         state:enm_updt()
  847.         state:fx_updt()
  848.         state:star_add()
  849.     end;
  850.     draw = function(state)
  851.         state:fx_draw()
  852.         state:enm_draw()
  853.         state:plr_draw()
  854.         state.t += 1
  855.     end;
  856. }
  857.  
  858. -- forwrad declarations
  859.  
Add Comment
Please, Sign In to add comment