【TIC-80】4方向簡易セミオートタイル（追記修正）

**パターンのところがかなり間違っています、おそらく。すみません**

「[TIC-80](https://tic.computer/)」でもオートタイルをしたい！

※ タイルの作成方法が複数あるっぽいので最後に追記しました。
※ パターンが（多分間違っていたため、メモとソースを修正）

というラノベのタイトルのような希望を持っていましたが、作ってみました。
いや「TIC-80」「オートタイル」で検索すると自分の記事が引っかかるようになってしまって‥。
うーん、ちょっと記事連投しすぎですかね、ブログとか作って移動した方がいいのかなあ。

参考にさせていただきました。
https://qiita.com/keidroid/items/4f16b890840e3d363585
https://github.com/nesbox/TIC-80/wiki/Auto-Tileset-Mapping

8方向ではなく4方向、オートではなくセミオートですが。

![autotile.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/e0ec01b2-8aad-28e1-31c5-077e70fac0e6.gif)

こんな感じでスプライトシートのFGの方に（BGでもできますがスペースの都合上こちらがデフォルトです）16x16のタイルチップ(?)を登録します。
（これを16分割して中央の8x8をループに、外側4ドット枠を境界に使用します）

適当に`semi4tilef()`を1回実行するとBGタイルに自動でタイルが生成されます。
（`semi4tilef(chipid,tileid,nums,nosync)`で生成元スプライトid、生成先タイルid、個数、ticファイルへの反映なし、も選択可能）

![tilesheet.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/5df4e84f-fd0d-f05a-9d1a-c584825f2723.gif)

（8種類でタイルシートの半分を使用してる‥）
![mapedit.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/38307de9-d181-e094-0832-258b21fd3222.gif)
マップエディタで**一番上のタイル**を配置していきます。

![edit2.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/e9430483-8778-8d1f-bee3-4ba225b468bc.gif)

```Lua
rm=semi4tilef()
function TIC()
	cls(13)
	map(0,0,30,17,0,0,12,1,rm)
end
```
`semi4tilef()`の返り値（関数）を map 命令にセットして実行。
（チップ作成時に透明色を決めておき、map命令で指定も有効。上記例ではピンクを透明扱い）

![auto4tile.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/479e22b9-3454-6765-7205-d56dec08bd85.gif)

おー、思ったよりいい感じです。
まあ4方向なのでそれなりといえばそれなりですが。

以下、コードとなります。

```semi4tilef.lua
PTN={
	{5,6,9,10},{8,6,4,10},{2,1,9,10},{0,1,4,10},
	{5,11,9,7},{8,11,4,7},{2,3,9,7},{0,3,4,7},
	{5,6,14,13},{8,9,12,13},{2,1,14,13},{0,1,12,13},
	{5,11,14,15},{8,11,12,15},{2,3,14,15},{0,3,12,15}
}


-- common function from TIC-80 wiki
function sset(x,y,c)
	local addr=0x4000+(x//8+y//8*16)*32
	poke4(addr*2+x%8+y%8*8,c)end
function sget(x,y)
	local addr=0x4000+(x//8+y//8*16)*32
	return peek4(addr*2+x%8+y%8*8)end

-- my function
function semi4tilef(chipid,tileid,nums,nosync)
	local cid,tid,n=chipid or 256,tileid or 0,nums or 8
	for i=0,n-1 do
		local cox,coy=(cid+i*2)%16*8,(cid+i*2)//16*8
		for nn=0,15 do
			local tox,toy=(tid+i)%16*8,(tid+i+nn*16)//16*8
			for xx=0,7 do
				for yy=0,7 do
					local ptnum=PTN[nn+1][(xx<4 and 0 or 1)+(yy<4 and 0 or 2)+1]
					local orgc=sget(cox+ptnum%4*4+(xx%4),coy+ptnum//4*4+(yy%4))
					sset(tox+xx,toy+yy,orgc)end end end end
	if not nosync then sync(1,0,true) end
	return function(tile,x,y)
		local Ltile=mget((x-1)%240,y%136)
		local Utile=mget(x%240,(y-1)%136)
		local Rtile=mget((x+1)%240,y%136)
		local Dtile=mget(x%240,(y+1)%136)
		local dLeft=(tile~=Ltile)and 1 or 0
		local dUp=(tile~=Utile)and 2 or 0
		local dRight=(tile~=Rtile)and 4 or 0
		local dDown=(tile~=Dtile)and 8 or 0
		return tile+(dLeft+dUp+dRight+dDown)*16 end end

rm=semi4tilef()

function TIC()
	cls(13)
	map(0,0,30,17,0,0,12,1,rm)
end

```

組み合わせはやっぱり手作業でした（最初のPTN部分）
必要ないと思いますが一応メモを残しておきます
メモを2パターンのものと差し替えました。

元タイルを4分割して、外側にコピーした後、端になった場合の加工をするのですが、コピーの仕方に違いがあります。（左も修正）

![newpattern.png](https://qiita-image-store.s3.amazonaws.com/0/284455/b8c21710-6c38-bbac-3e34-112d15fe734d.png)

最初に作ったものが左で、こちらがツクールでの「森タイプ」だと思います（自信なし）

右の方が通常パターンでしょうか。
組み合わせ方が違うのでこちらのPTNも載せておきます。

```lua
PTN2={
	{5,6,9,10},	{4,6,8,10},{1,2,9,10},{0,2,8,10},
	{5,7,9,11},	{4,7,8,11},{1,3,9,11},	{0,3,8,11},
	{5,6,13,14},{4,6,12,14},{1,2,13,14},{0,2,12,14},
	{5,7,13,15},{4,7,12,15},{1,3,13,15},{0,3,12,15}
}
```

うーむ、奥が深いですねぇ。