「国盗りす」にはフィーバーモードなるものがあります。
- 光っているエリアに兵糧を落とし、全て埋めると次のエリアが光る
- 埋める際に一発で埋めるとフィーバーモードとなり全てのエリアが対象となる
こんな感じですね。
一つのエリアを光らせる場合は、該当位置の参照タイルIDを差し替えていました。
茶色のタイルから黄色のタイルに差し替えるイメージですね。
ただフィーバーモードで全てのタイルを差し替えるのは重いかなと思い(HHEM)、
パレットの色データを書き込むといいかなと考え「TIC-80 wiki」を覗いてみると
パレットの差し替え(というよりカラーインデックスの参照先のみ変更?)の
関数が紹介されているみたい。
おーこれを使えば一定間隔で、パレット差し替え ⇔ 元に戻す ということができるかな?
ただ、現在光っているかどうか?というフラグ?(状態?)はどのデータに持たすのが
妥当なんだろう。指定色はすべて差し替わるってことはフィールドではないような‥。
あ、色を変えるという操作(関数)に持たせればいいのかな、Luaはそれが楽にできる、
みたいな紹介を読んだ覚えが。
それっぽいコードを参考にしつつ実装
(ON-OFFのフラグのものがあるかなと探しましたが、調べ方が悪かったのか
カウンターのサンプルが大半でした)
do
SEA_COL=13
LAND_COL=4
SHINE_COL=14
end
-- common function from TIC-80 wiki
function pal(c0,c1)
if(c0==nil and c1==nil)then for i=0,15 do poke4(0x3FF0*2+i,i)end
else poke4(0x3FF0*2+c0,c1)end
end
pal_toggle=function(offcol,oncol)
local ofc,onc=offcol or LAND_COL,oncol or SHINE_COL
local onflag=false
local f
f=function()
onflag=not onflag
if onflag then pal(ofc,onc)
else pal() end
end
return f
end
function test()
landshine=pal_toggle()
seashine=pal_toggle(SEA_COL)
end
test()
function TIC()
map()
if btnp(0,1,30) then landshine() end
if btnp(1,1,30) then seashine() end
end
だいたい想定通りですかね。
ただ pal() が全色リセットなので、両方ON時に一方を解除するともう片方も解除されますね。
‥‥、まいいか。
(ゲーム中は landshine() のみ一定間隔で呼ぶ)
そういえば、エリアがつながっているか、の判定関数を再帰で呼び出すみたいなことを
する時にすでにチェック済か、という情報を記録する時も、関数に持たせた方が
自然に書けるのかな?
気がする‥けど気がするだけで実装方法は分からないので今後の課題とします。