Hello, my name is pornanime.

ミニスーファミ予約開始!

戦果

f:id:gyuque:20170925025126j:plain
戦局必スシモ好転セス

あのですね、Amazonの新商品ってすぐには検索に出てこないんですね。なので、Twitterを監視して誰かが貼ったリンクを辿る方が早いという(じゃあそいつはどこで見つけてくるんだという話ですが、検索用のサーバに当たり外れがあるみたいなことでしょうか)
この手の争奪戦には慣れてないので、Switchとかで練習をしておけばよかった。

早い者勝ち系は玉砕したので、ジョーシンの抽選に申し込んであとは天に任せる。まさに任天堂

f:id:gyuque:20170925024540p:plain

開発状況

スタート時のデモを作った。光の筋は文字表示用のBG面を潰して出してるので、完成版ではデモが終了するまで文字は消しといて終わったら出す、という感じになります。

f:id:gyuque:20170925030129g:plain

ゲーム本編に関してはスタートからクリアまで一通り揃ったので、演出とかストーリーとか、そもそもタイトルとか、久々に打ち合わせでもしようかな。

広告を非表示にする

近況報告

スーパーファミコン開発

f:id:gyuque:20170907031132p:plain

一言で言うと「ロックマンXの動きでフリッキー」みたいな内容に落ち着きつつある。フリッキーというのはこれ↓

敢えてリッチなアーケード版ではなくSG-1000版を貼ったのは我が家にあったから……
しかしひとつ、SG-1000版の方が優れている(と思う)点があって、分かります?
ゲームスタート時に、床にある模様(フリッキーの家?)の動きが音楽と同期しているという点なんですが、どうでしょう。

さてフリッキーは置いておいて、我々のスーファミゲーの方は以下。



↓方向キー2回またはAボタンで、空中・地上ともにダッシュが可能。ダッシュは攻撃を兼ねていて、猫に体当たりすると魚を落とさせることができる。魚を落とした隙に奪う。
f:id:gyuque:20170902042329g:plain


↓魚を奪われた猫は怒り状態になり、これに触れるとプレイヤーの方が魚を落としてしまう。プレイヤーが落とした魚に猫が触れると取り返されてしまう。
f:id:gyuque:20170902042436g:plain


↓魚をすべてUFOに持って帰るとUFOが離陸しクリア。
f:id:gyuque:20170907031552g:plain

  • 以上のスクリーンショットはまだWindows上で動いているプロトタイプのもの。
  • 敵(猫)の数が4体であれば、スーファミ実機での実装時に性能上の問題は無い見込み。5体ぐらいまでならいけるかも。
  • 怒った猫に攻撃判定を付けたら4体でもかなり難しくなったので、5体も要らないかもしれない。

あとは残りのToDoというかトヨイさんからの要望として、ボスキャラが欲しいというのがある。

iPad Pro で絵を描く

f:id:gyuque:20170907234026j:plain

トゥイッターではこいつ狂って散財してるぞとか言われたくなかったので借りてると書いたんだが、まあ、iPad Proも買ったんだよ。

絵を描くなら思い切って大きいやつがいいのかな? と思ったが、店頭で12インチ版を見たところ想像以上にデカくて、これを電車の中で振り回してるのは完全にアホだと思って一番小さい9.7インチにした。安いし。

で、iPad Pro で絵を描くなら Procreate というのが定番らしい。App Store では Essentials と言って要するにApple公認のオススメ印が付いている。1000円もしない物だしいきなり入れた。

……。

うーん、これは何だ、利用者をストレスで殺すために設計されているんだろうか?
ジェスチャが誤爆しまくって、頑張って描いた線が次の瞬間にUndoの誤爆で消えたりする(ここでうっかりペン先が着地するとRedoが吹っ飛ぶ)
もうiPhone 10周年とか言ってる時勢だしそろそろ「クールでオシャレなUI」信仰はやめてほしいな……と言いつつこれより良いソフトがあるのかどうかも分からないので、ぶつくさ言いながら使ってるんだけど。

手袋は結構有効らしい。
http://shunirr.hatenablog.jp/entry/2017/06/21/005921

ちなみにProcreateはイラストレーターの寺田克也氏も使っているらしいけど、弘法筆を選ばずというやつで上手すぎる人の感想はあまり参考にならない気がする

広告を非表示にする

役に立たない話

液タブを買った

2017年になっても液タブはそんなに安くないが、まあ2年ぐらい紙で練習したしそろそろいいかなと。

f:id:gyuque:20170729025822j:plain

結果として、高いだけの価値はあった。紙の時は鉛筆だけで済ませてたけど、デジタルならUndoしながらペン入れできるし、清書したらそれだけでなんか上手くなった気になる。
まあ本当に上手い人は鉛筆で描いても上手いけどね……

やっぱさ、ローテクで大道芸かます方が格好いいよね、と言うとVoQnあたりに馬鹿にされそうだけど。まあでもローテクには浪漫がある。

一つ不満があるとすればこれ、PCが内蔵されていて単体でWindowsが動くんだけど、そうするとキーボードを繋がずに使うことが多くなるわけで、キーボードが無い状態でファンクションキー6個じゃ全然足りない。恐らくWindows 10の要件でボリュームボタンなんて付いてるけど、そんなもん付けるコストはファンクションキーに回してくれよと思った。


うるせえよ!

f:id:gyuque:20170729025543p:plain
f:id:gyuque:20170717150627p:plain



スーファミ「に」プログラムを移植する

f:id:gyuque:20170729030608p:plain

以前、豊井さん、NinoさんとSkypeで打ち合わせをした時に

Windowsでプロトタイプを作ってスーファミに移植するって、どういうこと? 「移植できるように作っている」って、具体的に何やってんの?

という話が出て、これはどう考えても一生誰の役にも立たない知識なんですが、インターネットというのはそういう情報を書く所だと信じているので、今日はこの話です。
例えば非常に簡単な例として、キャラクターが走るアニメーションに4コマ使う場合、フレームの番号を

0,1,2,3, 0,1,2,3, 0,1,2,3……

という感じで発生させるプログラムが必要になりますが、これが5コマになって

0,1,2,3,4, 0,1,2,3,4, 0,1,2,3,4……

となった途端に、プログラマーが嫌な顔をするという話があります。
なんでよ、というと、4コマでループするカウンタの場合は、0,1,2,3,4,5,6,7,8……と単純に増える馬鹿カウンタを別に1つ用意しておいて、その下位2bitを取れば簡単に生成できるんですが、5コマだとこの技は使えないので、最大値をチェックして0に戻す……みたいな処理が増えてしまうという事情があります。

「5で割った余り取ればいいでしょ?」というのも、実は除算というのは贅沢品で……という話があって。

つまり、「ドラクエのレベル1縛りプレイ」みたいなプログラミングをする必要があるという話です。

f:id:gyuque:20170729003454p:plain

広告を非表示にする

ミニスーファミ記念更新

ミニスーファミ

ついに来てしまいました。

見てくださいよこれ。ミニスーファミ。家に来たわけじゃなくて発表されただけですが。
少し前の話をすると、Microsoftが「SNES Classic Edition」という項目が入ったE3の来場者向けアンケートを事前に漏らしてしまって、これはE3で発表されるぞ!と話題になっていたところ結局E3では発表されなくてガックリ、と思っていたらE3が終わった途端に発表されたという経緯がありまして、喜びもひとしおと言ったところであります。

とりあえず、Amazonに来た瞬間に注文を撃ち込めるようにしときますか。

進捗

さて。だいぶ間が空いてしまいましたが、とりあえずゴールデンウイーク頃の話から。
京都でNinoさん、豊井さんと会って打ち合わせという程でもないですが、改めてアイデア出しみたいな会をしました。

f:id:gyuque:20170703005715j:plain

これは貴重な豊井さんの生絵が入ったアイデアノートです。

f:id:gyuque:20170703005725j:plain

全く関係ないですがこれは私のカーバンクルです。

さて、いろいろ話した結果

  • ボス出したい
  • ダッシュしたい

といった要望が出て(プログラムはもうフィックスして弄らないつもりだったんですが)やっぱりプログラムにもう一度手を入れる決心をして、またWindows上で動くプロトタイプの方に戻ってプレイヤーの動きを考えたりしているところですが……

f:id:gyuque:20170703005736g:plain

見ての通り、豊井さんが以前よりがっつりと関わっていただけるようになり、上のスケッチになったキャラクターがちゃんと動いております。背景は今のところ自分で打った仮の物ですが、こちらも進行中です。

広告を非表示にする

スーファミサウンドの裏で何が行われているか

qSPCの開発も山場を越えた感があるのでたまには進捗報告以外の話を……

多分、普段は宇宙語が書いてあるブログだと思って見てない人が多いと思うので前提知識を手短に書いておくと:

  • スーパーファミコンにはメインのCPUと別にサウンド用のCPUが乗っている
  • オーディオデバイスにはサウンドCPUからしか触れない
  • サウンドCPUはメイン側とは独立したメモリを抱えている
  • このメモリは64KBしかない
  • メインCPUとサウンドCPUのやり取りには、あまり速くない通信路を使う必要がある

という制約があるので、いかにデータをコンパクトにして、最低限の物だけをサウンドCPUに送るかという所で開発者の腕が試されることになる。で、プロの技はどんなもんだろうかと、メモリダンプを見ながら定番のグラディウスIIIをやってみると……

ボスを倒して、ステージが変わるタイミングで一瞬画面が止まるので、ここで曲を入れ替えていると思ったんだけど、ここでは転送している様子がないな。転送している様子がないという事は、グラディウスIIIのBGMは全曲分、他のデータとの兼ね合いを考えれば数KBに詰め込まれているということになる。
マジで?いくらコナミでもそんなことできるの?

そこで、ゲーム中にミュージックドライバがどういう挙動をしているのか調べてみることにした。具体的には、Snes9xを改造して、S-SMP(サウンド専用CPU)のメモリアクセスと(メインCPUからの)データ転送をログに記録して可視化する。上手くいけばシーケンスデータにアクセスしている様子が浮かび上がるんじゃないか?という目論見だがさて……

・・・

というわけで。CPU/DSPのエミュレーション部分にロガーを仕込んだが、さすがにメモリアクセスを全部記録するとログが恐ろしく巨大になるので、画面の更新時間を基準にして3フレーム(1/20秒)単位で、128バイトごとのリード・ライトをサマリとして出力するようにした。これなら数分ゲームをプレイしてもログは1MBか2MBといったところで現実的。
で、このログをJavascriptで作った可視化ツールに食わすとこうなる。ああでも、スクリーンショットは手作業で貼り付けた。

f:id:gyuque:20170430020528p:plain

こんな感じで、青はRAM内のリード、赤はライトを表していて、本体(メインCPU)側からデータをロードすると大量のライト(赤い線)が現れる。シーケンス(楽譜)データを読んでいる部分はまとまったリード(青)という形でなんとなく見える。ちなみに薄い青はDSPによるサンプリングデータの読み出しなので、これが出ている箇所はほぼ確実にサンプリングデータが入っていることになる。

※ちなみに使っているROMはちゃんと自力で吸い出しているので悪しからず
f:id:gyuque:20170430122851j:plain


さて、グラディウスIIIの様子を見てみると?

グラディウスIII」はゲーム中に次の曲を先読みしている

最初に結論を言ってしまうと、全曲を詰め込んでいるわけではなかった。もっと巧妙なことをしていた。

f:id:gyuque:20170430021755p:plain

グラディウスIIIのミュージックドライバには、通常の処理をしながらデータを受け取る機能が付いていて、次に流す曲のシーケンスを裏でロードしているのである。
確かにグラディウスというゲームは展開が決まっているので、次の曲を先回りして準備しておくという処理もできそうである。

いやでも、SFC版はボーナスステージってあったよね?
というのが気になったので頑張ってボーナスステージに入るところまで進めてみた。すると……

f:id:gyuque:20170430033753p:plain

なんと、ボーナスステージの入り口が近づいてくると、シーケンスを先読みしていることが分かる。プレイヤーが実際にボーナスステージに入るかどうかは分からないので、入らなければこのデータは捨てられるということになる。この時代に投機実行をやってたのか。昔のコナミ凄い。いや、メタルギアシリーズのファンじゃないので、今のコナミに恨みがあるかというと別に無いんだけど、そろそろ外注でいいからグラ6作ってくんないかな。


修正

気になったのでボーナスステージに入らなかった場合と比較したところ、先読みしているのはボスBGMで「ボーナスステージに入るとボスBGMを破棄してボーナスステージ曲をロード」が正しいようでした。まあこれでも投機的と言えるか。もっとも、読み込みにかかる時間を勘案して決めたら結果的にこうなっただけで、最初から意識して実装したわけではないと思う。

f:id:gyuque:20170501200340p:plain ◀ ボーナスステージに入った場合
f:id:gyuque:20170501200349p:plain ◀ ボーナスステージに入らなかった場合

ドラゴンボールZ 超武闘伝2」は「気」を溜める裏でサンプリングデータも溜めている

ドラゴンボールZ 超武闘伝シリーズ。

これ、みんなやったよね。今はプリパラやアイカツスターズばっかり見てる人間も昔は毎週ドラゴンボール見てたんですよ。

それは置いといてこのゲーム「デモ必殺技」というシステムがある。お馴染みの「かめはめ波」といった大技を出すと、ゲームの進行が中断しデモ画面が入って、派手に技を撃ってくれるというものである。
(どんなものかは動画を見た方が早い)

ちびっ子達の心を掴むのに一役買ったデモ必殺技だが、このボイスのデータは12KBぐらいある。64KBのうちの12KBはなかなか馬鹿にできないサイズなので、常に置いておくわけにはいかない。そこで、プレイヤーがデモ必殺技のコマンドを入れた瞬間に、通常技用のボイス(これは汎用的に使えるよう、具体的な技名じゃなくて掛け声になっている)を潰して、デモ必殺技用のボイスをロードしている。デモが終わると通常技用のボイスをロードし直してゲームに戻る。
具体的には以下のような感じ(動画とキャラが違ってごめんなさい)

f:id:gyuque:20170430024158p:plain

ちなみに1P側と2P側は均等に容量を割り当てられていて、デモ必殺技の時も各プレイヤーの側だけを潰すようになっている。デモ必殺技の途中で撃たれた側がコマンドを入力すると撃ち返せるというシステムがあるので、相手の領域まで潰してしまうと、撃ち返しのボイスが出せないからだと思われる。

f:id:gyuque:20170430024211p:plain

ボイス以外の部分はもちろん共用の効果音やBGM用の楽器が入っている、筈。

このゲーム、世間的にはトーセが作ったことになっているようだけど、本当はどうなんでしょうね。ナムコとくっつく前のバンダイが作ってるわけがないのは確かだけど。

テイルズオブファンタジアのボーカル付きオープニング

あれもどうなってるのか見ようと思って秋葉原行ってカセット買ってきたんですけどね……
f:id:gyuque:20170430030746p:plain
なんかRetrodeでは吸い出せなくて。

フォーラムにも「困った!」という書き込みがあったけど特に解決したわけでもなく渋い感じで終わってしまった。



カットしていないログの巨大画像はこちら

広告を非表示にする

qSPC 2.0 (ほぼ)完成

Ninoさんと相談して同梱するサンプリングデータを選定すれば、配布できそうな状態に。

ドライバの機能はめちゃくちゃ貧弱で、ポルタメントもビブラートも無いので所謂「ベタ打ち」の音しか作れない状態(かろうじてベロシティだけ制御できる)なんですが、まあ使ってくれる人が現れれば強化する動機にもなるでしょう。
せめてもの長所として、簡単に実機再生できる+実機での安定性は高い筈です。ゲームに組み込むために作ってるのに実機で動かないんじゃ話にならないので。

コンパイル〜再生までの動画

MMLコンパイルしている様子
f:id:gyuque:20170421040952p:plain

↓生成したSPCファイルを「黒猫SPC」で再生
f:id:gyuque:20170421041025p:plain

↓生成したSMCファイルをSnes9xで実行
f:id:gyuque:20170421041010p:plain

広告を非表示にする

qSPC進捗

クイックロード(勝手に決めた用語)実装

64KBのサウンドドライバを丸々入れ替えると2秒ぐらい待たされるので、シーケンスが入っている先頭付近(もうちょっと削れるけど今のところ8KB)だけを入れ替える機能。当然、サンプリングデータは全曲で共通でないとぶっ壊れるので、条件を満たしている場合のみROM内に「クイックロード可」のフラグを立てておく機能をコンパイラに実装している。

ところで、一番苦労した箇所が……ロード時にSpinner(風車みたいなアイコン)を表示する処理。無くてもいいだろ!って言われそうだけど、スーファミ時代に無かった(と思う)UIが表示されるのは面白いかなと思ったのでなんとか実装した。
なぜ苦労したか? どうもPPU(グラフィック)とSPC(サウンド)へのアクセスは競合するらしく、画面更新をVBLANK割り込みで処理したままSPCにアクセスすると、データが不規則にぶっ壊れるのである。残念ながら回路図までは読めないんだけど、エミュレータのソースを見る限り、何か悪いことが起きそうなことだけは確かだった(特にDMA/HDMAが怪しい)。ということで、SPCへの転送中は割り込みを止めて、レギュラーの処理で画面を更新している。

広告を非表示にする