GBAは知らないといけないことが多いです。
というのもBG、スプライトの画像ファイルは別々。
変換後のフォーマットも知っていないといけないからです。
他にもOAM(拡大縮小表示など)、キー入力(ビット配列)、SRAM、乱数。
乱数は以下のような関数を作らないと、毎回電源ONで同じ値になってしまいますし。
IWRAM_CODE void ScoreInitRnd(void) { SramSeek(0x10); u32 r = SramRead32(); if(r != 0) { RndInitSeed(r); } SramSeek(0x10); SramWrite32(Rnd32()); }
画面単位のフレームカウンター、キー入力などのプレイヤーが不規則に動かした分の値を
加えて、事前に用意したテーブルと混ぜ混ぜする方式もあるようです。
といっても、コードの間に異物を入れるようなもので、結局は
・(上記の関数のように)ゲーム開始時に更新する
・ゲーム終了時、スコア書き込みタイミングで更新する
というのがスッキリしていいように思います。
CEDECの講演ではとても興味深い発表がありました。
http://www.4gamer.net/games/042/G004287/20140905040/
ROM参照法はかなり痺れました。考えもしなかったです。
そういえばメルセンヌ・ツイスタのサイトを久しぶりに見たら
TinyMTの最新版(ver1.1 2015/4/25)が公開されています。
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index-jp.html
TinyMT はMersenne TwisterやWELL RNGと比べて小さな疑似乱数生成器です。 32bit 出力の tinymt32 は内部状態空間に16バイト、パラメータに12バイトしか使いません。
実はarduboyのtiny depthにも使われているのですけれど、その時、
敵弾が均等にまんべんなく攻撃してきてゲームになりゃしない(汗)という
事態が発生しました。嬉しいやら悲しいやらです。
結局、自機弾の最大数を4から5にして弾幕を厚くして対応しました(^^;。