BM98FinalSecret

BM98最後の秘密とは、Extended Character機能、すなわち、ゲーム中のキャラクターすべてをBMSファイル側で変更する機能である。

ただし、この機能は、拡張し納得のいくものになり次第、公開しようと思っていたのだが、いろいろ事情があって、BM98そのものの開発をうち切ることになり、日の目を見ることのなくなった機能である。

そこで、この機能を使った曲の、BMRの方での動作は保証できない。あくまでBM98ver3.18用として認識していただきたい。また、それ以降のバージョンで、きくちゃんによるものは、ビットマップファイルが書き換えられているので、このテキストの内容の限りではない。

また、基本的にBM98について、やねうらおは一切サポートしないと言っているの同様、ここの内容についても、一切サポートしないので、質問メールは勘弁してほしい。

それから、スプライトナンバー等、BM98固有の定数が出てくるが、これらは、BMRとは一切無縁である。

 

 

まず、この機能のことをヘルプでも少し触れているので、それを抜粋する。

--------------------------------------------------

Extended Character (BM98 v3.18以降) <非公開機能>

以下は、やねうらおのメモだとお考えください(笑)

・ゲーム中の任意のスプライトをユーザー定義する機能。

#ExtChr <SpriteNo.> <BMPNo.>

<start_x> <start_y> <end_x> <end_y>

{ <offset_x> <offset_y> { <x> <y> } }

通例、これとExtended Object機能とを併用して使う。

スプライトNo.とキャラクタNo.とは意味が違う。--------------------------------------------------

また、Extended Object機能と併用して使うと書いてあるが、そいつは、どこにあるかというと、チャンネルナンバー05番のところにちゃっかり書いてある。

--------------------------------------------------

05   [Extended Object] <非公開機能>

  落下してくるオブジェを別のキャラクターナンバーのものにすり替える機能。この行の下にある行のオブジェに順番に割り振られる。

--------------------------------------------------

このチャンネルナンバーの次の行に書いてあるオブジェ配置データに対して、こいつが有効であることはわかるが、キャラクターとして何をどう書けば良いのか、それがまったくもって不明確である。

実を言うと、やねうらおもよくは覚えていない(笑)

なんか、あのときは、坂本龍一の曲をモチーフに、自分なりに編曲を行なっていて、そのとき1オクターブのピアノ鍵盤が出てるBMSファイルを作るつもりで、こんな機能をつけた覚えだけはある。

そんなわけで、ちょっとソーステキストを覗いてみよう。

int ExtChr[] = {
0,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,
// 0x ユーザー定義可能部分
976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,
// 1x  ユーザー定義可能部分
992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,
// 2x ユーザー定義可能部分
1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,
// 3x
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 4x
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 5x
941,942,943,944,945,946,947,948,949,950,951, 0, 0, 0, 0, 0,
// 6x 金色オブジェ5パターン 赤 緑 灰 黒BM98金色(新オブジェ)
730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,
// 7x 金A B C D E F G H I J K L M N O P
746,747,748,749,750,751,752,753,754,755,760,761,762,763,764,765,
// 8x Q R S T U V W X Y Z a b c d e f
766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,
// 9x g h i j k l m n o p q r s t u v
782,783,784,785,790,791,792,793,794,795, 0, 0, 0, 0, 0, 0,
// ax w x y z - " ! ? & .
800,801,805,806,807,808,810,811,812,910,911,912,913,940, 0, 0,
// bx BM レコードSong SP DP BPM ヒト ★ ☆ 1P 2P 1Pd 2Pd 坂田
850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,
// cx 白A B C D E F G H I J K L M N O P
866,867,868,869,870,871,872,873,874,875,876,877,878,879,890,891,
// dx Q R S T U V W X Y Z / . ! % @ ?
720,721,722,723,724,725,726,727,728,729, 0, 0, 0, 0, 0, 0,
// ex 金0 1 2 3 4 5 6 7 8 9
880,881,882,883,884,885,886,887,888,889, 0, 0, 0, 0, 0, 0
// fx 白0 1 2 3 4 5 6 7 8 9
};

ちゅーことで、05チャンネルにデータを送信することで、01〜FFまで、255種類のキャラクタを表示させるができるわけだが、それが何番のスプライトに対応するものであるかは、この表を見れば一目瞭然だ。(ただし、やねうらおにのみ:笑)

たとえば、キャラクタナンバー01は、スプライトナンバー961である。(ユーザー定義可能部分)
また、キャラクターナンバー50は、スプライトナンバー941であり、それは金色オブジェである。
はたまた、キャラクターナンバーD2は、スプライトナンバー867であり、それは、Rという白い文字である。

というようになっている。ということで、実は、第5チャンネルだけで、拡張キャラクタとして、文字などをオブジェとして落下させることができる。

さらに、ここで、問題となるのは、スプライトナンバー961〜1023がユーザー定義可能部分として解放されていることである。ここに来て、さきほどの

#ExtChr <SpriteNo.> <BMPNo.> <start_x> <start_y> <end_x> <end_y> { <offset_x> <offset_y> { <x> <y> } }

が初めて意味を持つ。{ }の部分は省略可能ということ。

#ExtChr 961 1 0 0 99 99

などとすれば、スプライトナンバー961を、ビットマップナンバー1(これは、#bmpで定義したときのビットマップナンバー)の(0,0)から(99,99)の100×100ドットの部分として定義するという意味である。これにより、ユーザーで用意した任意のビットマップの特定の部分をユーザースプライトとして定義することが可能となり、それをさきほどのExtended Objectで表示することが可能だというわけだ。(といま思い出した:笑)

そして、<offset_x> <offset_y>をオプションで指定できるが、これは、オブジェ位置を調整するためにある。

たとえば、オブジェを表示するとき、オブジェ高さを表示段階で参照して、そのオブジェの下面にプレイポイントが来るようにするのは、あまり洗練されたプログラムではないとやねうらおは考えたわけだ。このころ、ぽっぷんの移植のことが少し頭にあったので、オブジェクトの下面がプレイポイントでないこともありうることを多少意識もしていたのだ。

そこで、オフセットを持たせることにした。たとえば、(−5,−10)のオフセットを持つスプライトに対しては、(100,120)の座標に表示しなさい、と命令しても(95,110)の座標に表示されるわけである。このようにすることによって、内部的には、(100,120)の座標で管理できる。すなわち、プレイポイントに表示するように指示しておけば、それのスプライト表示の段階で、適切なオフセットを得て、適切な位置に表示されるという仕組みである。

ただ、そのことに気づいたのは、ver3.16あたりなので、スクラッチは実はオフセットを持っていなかった。(と思う) それの調整を行なうためにも、このオフセット値は重要である。

最後のオプションのX,Yだが、この指定があると、画面上の、その座標位置にそのスプライトを配置するのである。鍵盤のデザインを変更したり、DanceDanceRevolutionのようにぺたんと大きな矢印を用意したりすることの可能だ。また、いま定義されているスプライトを上から定義して、画面外に追い出し、表示されないようにすることもできる。

 

わくわくしてきたところで、どのスプライトナンバーが何であるのか、その割付を完全に知りたいと思う人もいるだろう。そうでなければ、いまある鍵盤を別のキャラクタに再定義してしまうというようなことができないからである。

そこで、以下には、スプライト定義のためのルーチンをそのまま抜粋する。メモのようにして、何番が何であるか記されている。ただし、dynamicと書いてある部分は、動的に変更されるから、こいつを変えても無駄である。また、スプライトは、原則的に0〜511までが表示されるもので、あと512〜1023は、非表示であって、実行段階で、10番のスプライトは513番のスプライトをコピーせよ!などとして、10番にスプライト特性情報を持ってきて、10番のスプライトを画面表示することにより、513番のスプライトを画面表示することにしてある。このようにすることにより、一種類のスプライトを複数個表示したりすることが簡単になるし、何より管理の手間が楽になる。

しかし、増やしすぎて、512個では足りなくなったため、ネオン表示用に1024〜1087を使っていたような気もする。(なんかダサイなあ...)

まあ、このへんは突貫工事なので深くはつっこまないように(笑)

 

void DefSpriteGames(void) // ゲーム画面のためのスプライト初期化
{
int i;
for(i=0;i<512*2+64;i++) {
ySpriteMove(i,-10000,-10000); // 全クリア
ySpriteVisible(i,true);
}

// 00 - 11 : (dynamic sprite) Greatの爆発アニメ用
// 12-75 : Score表示用 (61-76 : AutoPlay表示用)
// 71-75 : (dup.) CPU % 負荷率表示用

// 77-79 : 空きのはず..

// 80,81,82,83,84,85,86,87,88 : 1P側の鍵盤フラッシュ&スクラッチ
// 89,90,91,92,93,94,95,96,97 : 2P側の鍵盤フラッシュ&スクラッチ

// kazu:光っているキーボードの個別パーツ。
yDefSprite(80,112,1,123,25); // 1(上部)
ySpriteMove(80,SCR1P1+1,SCRDWN3-1);
yDefSprite(81,112,26,133,46); // 1(下部)
ySpriteMove(81,SCR1P1+1,SCRDWN3+25-1);

yDefSprite(82,124,1,140,25); // 2
ySpriteMove(82,SCR1P2+2,SCRDWN3);

yDefSprite(83,141,1,146,25); // 3(上部)
ySpriteMove(83,SCR1P3+8,SCRDWN3-1);
yDefSprite(84,133,26,154,46); // 3(下部)
ySpriteMove(84,SCR1P3+1,SCRDWN3+25-1);

yDefSprite(85,147,1,163-1,25); // 4
ySpriteMove(85,SCR1P4+4,SCRDWN3);

yDefSprite(86,164-2,1,175,25); // 5(上部)
ySpriteMove(86,SCR1P5+9,SCRDWN3-1);
yDefSprite(87,154,26,175,46); // 5(下部)
ySpriteMove(87,SCR1P5+1,SCRDWN3+25-1);

yDefSprite(88,177,2,210,46); // スクラッチ
ySpriteMove(88,SCR1P6+2,SCRDWN3);

for(i=80;i<=88;i++){
ySpriteCopy(i+9,i); // かしこいなー俺:p
ySpriteAdd(i+9,SCROFS,0); // スプライト相対移動
}

// 98,99 : 画面下のキーボード(赤ライン除く)
yDefSprite(98,1,1+5,100,89); // for 1P ノーマルキーボード(全体。スクラッチ含む)
ySpriteCopy(99,98); // for 2P

// 100-309 : (dynamic sprite) ノート。1画面同時数200という制限はここから来る

// 310,311 : 1P & 2P "Great / Good / Bad / Poor "
// NoteSprite.h あっちゃで使うから、これ、使っちゃダメよん。

// 312-315 : "1P","2P"

// 316 - 325 : 縦小節線 (こっちの方が優先か...)
for(i=0;i<10;i++){
yDefSprite(316+i,64,91,64,91+(SCRDWN>>1)-1);
}
ySpriteMove(316,SCR1P3,0); // もう移動しといちゃえ!
ySpriteMove(317,SCR1P5,0); // もう移動しといちゃえ!
ySpriteMove(318,SCR1P6,0); // もう移動しといちゃえ!
ySpriteMove(319,SCR1P3,SCRDWN>>1); // もう移動しといちゃえ!
ySpriteMove(320,SCR1P5,SCRDWN>>1); // もう移動しといちゃえ!
ySpriteMove(321,SCR1P6,SCRDWN>>1); // もう移動しといちゃえ!

// 322-7 : 2P用縦小節線

// 328-330 : CPU負荷率

// 331-430 : (dynamic sprite) Voltage Meter

// 431,432,433,434,435,436 : 1P キーを叩いたときの赤の縦ライン
// 437,438,439,440,441,442 : 2P キーを叩いたときの赤の縦ライン
for(i=431;i<=442;i++){
if (i==436 || i==442) {
yDefSprite(i,65,91,99,91+160-1); // スクラッチライン
} else {
yDefSprite(i,65,91,84,91+160-1); //
}
ySpriteVisible(i,false); // ディフォルトでは不可視やろ?
}
ySpriteMove(431,SCR1P1+1,0);
ySpriteMove(432,SCR1P2+1,0);
ySpriteMove(433,SCR1P3+1,0);
ySpriteMove(434,SCR1P4+1,0);
ySpriteMove(435,SCR1P5+1,0);
ySpriteMove(436,SCR1P6+1,0);
for(i=0;i<6;i++){
ySpriteCopy(437+i,431+i);
ySpriteAdd(437+i,SCROFS,0);
}

for(i=0;i<12;i++){
ySpriteCopy(443+i,431+i);
ySpriteAdd(443+i,0,SCRDWN>>1);
}

// 455-497 : for displaying debug message(dup.)
// (455-486) : 画面フレーム他(定義は、BGScr.cpp)
// (487-497) : INSERT COIN & CREDITS 0/2

// 498-499 : 1P/2Pの下の赤ライン
yDefSprite(498,1,1,100,5); // for 1P ノーマルキーボード(全体。スクラッチ含む)
// defined BGScr.cpp

// 500-506 : FPSの表示用

// 507 BM
yDefSprite(507,340,345,426,374); // BM98タイトルロゴ・小

// 508-511
yDefSprite(508,174,48,176,52); // 右向き三角マーク
yDefSprite(509,178,48,180,52); // 左向き三角マーク
ySpriteCopy(510,509);
ySpriteCopy(511,510);

/*
(117,1,121,73) // 小節左サイドの線
(239,1,247,73) // 小節右サイドの線
*/

// 513-1023 : free セコイことを言わずに豪快に使おう!
for(i=0;i<4;i++){
yDefSprite(513+i,112,48+i*6,131,52+i*6); // 白オブジェ
yDefSprite(523+i,133,48+i*6,152,52+i*6); // 黒オブジェ
yDefSprite(533+i,147,147+i*6,180,151+i*6); // スクラッチ
}
yDefSprite(513+4,208,48,230,53); // 白オブジェのびよーん
ySpriteOffset(513+4,-1,-1); // センタリング!
yDefSprite(513+5,207,48,231,54); // 白オブジェのびよーん
ySpriteOffset(513+5,-2,-2);

yDefSprite(523+4,208,56,230,61); // 黒オブジェのびよーん
ySpriteOffset(523+4,-1,-1);
yDefSprite(523+5,207,56,231,62); // 黒オブジェのびよーん
ySpriteOffset(523+5,-2,-2);

yDefSprite(533+4,147,171,180,179); // スクラッチのびよーん(1)
yDefSprite(533+5,147,181,180,190); // スクラッチのびよーん(2)

// フリーゾーン(1拍分)
yDefSprite(543,112,102,145,145-4);
yDefSprite(544,147,102,180,145-4);
yDefSprite(545,182,102,215,145-4);
yDefSprite(546,112,147,145,190-4);
yDefSprite(547,182,147,219,190); // びよーん BM98v3.16
// ySpriteOffset(547,-2,0);
yDefSprite(548,182,147,219,190); // びよーん BM98v3.16
// ySpriteOffset(548,-2,0);

yDefSprite(553,245,108,307,121); // GREAT
yDefSprite(554,245,123,307,136); // GOOD
yDefSprite(555,245,138,307,151); // BAD
yDefSprite(556,245,153,307,166); // POOR

yDefSprite(557,1,267,100,267); // 横小節線
// ySetSpriteSize(557,120,1);

// 赤文字
for(i=0;i<=9;i++){
yDefSprite(560+i,245+i*12,168,255+i*12,183); // 0-9
}

yDefSprite(581,154,48,157,64); // ゲージ・緑(暗)
yDefSprite(582,159,48,162,64); // ゲージ・緑(明)
yDefSprite(583,164,48,167,64); // ゲージ・赤(暗)
yDefSprite(584,169,48,172,64); // ゲージ・赤(明)

for(i=0;i<4;i++){
yDefSprite(700+i,112+i*30,72,140+i*30,100); // GREAT爆発アニメ
}

// 0-9 , A-Z , a-z ...
// 金色の文字
yDefSprite(720,245,89,257,106); // 0
yDefSprite(721,259,89,265,106); // 1
yDefSprite(722,267,89,279,106); // 2
yDefSprite(723,281,89,293,106); // 3
yDefSprite(724,295,89,309,106); // 4
yDefSprite(725,311,89,323,106); // 5
yDefSprite(726,325,89,337,106); // 6
yDefSprite(727,339,89,351,106); // 7
yDefSprite(728,353,89,365,106); // 8
yDefSprite(729,367,89,379,106); // 9

yDefSprite(730,245,1,257,18); // A
yDefSprite(731,259,1,271,18); // B
yDefSprite(732,273,1,285,18); // C
yDefSprite(733,287,1,299,18); // D
yDefSprite(734,301,1,311,18); // E
yDefSprite(735,313,1,323,18); // F
yDefSprite(736,325,1,337,18); // G
yDefSprite(737,339,1,351,18); // H
yDefSprite(738,353,1,357,18); // I
yDefSprite(739,359,1,371,18); // J
yDefSprite(740,373,1,387,18); // K
yDefSprite(741,389,1,399,18); // L
yDefSprite(742,401,1,421,18); // M
yDefSprite(743,245,20,259,37); // N
yDefSprite(744,261,20,273,37); // O
yDefSprite(745,275,20,287,37); // P
yDefSprite(746,289,20,301,39); // Q
yDefSprite(747,303,20,315,37); // R
yDefSprite(748,317,20,327,37); // S
yDefSprite(749,329,20,341,37); // T
yDefSprite(750,343,20,355,37); // U
yDefSprite(751,357,20,369,37); // V
yDefSprite(752,371,20,391,37); // W
yDefSprite(753,393,20,405,37); // X
yDefSprite(754,407,20,419,37); // Y
yDefSprite(755,245,41,257,58); // Z

yDefSprite(760,259,41,271,58); // a
yDefSprite(761,273,41,285,58); // b
yDefSprite(762,287,41,297,58); // c
yDefSprite(763,299,41,311,58); // d
yDefSprite(764,313,41,325,58); // e
yDefSprite(765,327,41,337,58); // f
yDefSprite(766,339,41,351,62); // g
yDefSprite(767,353,41,365,58); // h
yDefSprite(768,367,41,371,58); // i
yDefSprite(769,373,41,383,62); // j
yDefSprite(770,385,41,398,58); // k
yDefSprite(771,400,41,404,58); // l
yDefSprite(772,406,41,426,58); // m
yDefSprite(773,245,64,257,81); // n
yDefSprite(774,259,64,271,81); // o
yDefSprite(775,273,64,285,85); // p
yDefSprite(776,287,64,299,85); // q
yDefSprite(777,301,64,311,81); // r
yDefSprite(778,313,64,323,81); // s
yDefSprite(779,325,64,333,81); // t
yDefSprite(780,335,64,347,81); // u
yDefSprite(781,349,64,361,81); // v
yDefSprite(782,363,64,383,81); // w
yDefSprite(783,385,64,397,81); // x
yDefSprite(784,399,64,411,87); // y
yDefSprite(785,413,64,425,81); // z

yDefSprite(790,381,89,391,106); // -
yDefSprite(791,393,89,399,106); // "
yDefSprite(792,401,89,405,106); // !
yDefSprite(793,407,89,419,106); // ?
yDefSprite(794,309,108,325,125); // &
yDefSprite(795,327,108,331,125); // .

yDefSprite(800,201,229,426,314); // BM98タイトルロゴ・大
yDefSprite(801,1,269,181,385); // レコード盤

yDefSprite(805,183,316,426,343); // 「SONG SELECT」タイトル
yDefSprite(806,183,345,338,364); // for Single Play
yDefSprite(807,183,366,338,385); // for Double Play
yDefSprite(808,309,127,385,156); // Auto BMP counter!

yDefSprite(810,112,192,164,244); // ヒト
yDefSprite(811,166+23,192+9,192+23,218+9); // ★(中身塗りつぶし)
yDefSprite(812,194+23,192+9,220+23,218+9); // ☆(中身空洞)

yDefSprite(820,182,48,185,51); // リザルト表示用・赤い四角
yDefSprite(821,187,48,190,51); // リザルト表示用・緑色四角
yDefSprite(822,182,102,186,105); // リザルト表示用・ボーダ
// スクラッチオブジェから借用:p

yDefSprite(830,102,1,105,89); // 左側用・小
yDefSprite(831,107,1,110,89); // 右側用・小
yDefSprite(832,102,91,105,266); // 左側用・大(1)
yDefSprite(833,107,91,110,266); // 右側用・大(1)
// yDefSprite(834,245,203,420,206); // 上側用・大
// yDefSprite(835,245,208,420,211); // 下側用・大
yDefSprite(834,245,203,245+120-1,206); // 上側用・大
yDefSprite(835,245,208,245+120-1,211); // 下側用・大
yDefSprite(836,387,135,402,150); // 左上コーナー
yDefSprite(837,387,152,402,167); // 右上コーナー
yDefSprite(838,387,169,402,184); // 左下コーナー
yDefSprite(839,387,186,402,201); // 右下コーナー
yDefSprite(840,102,91,105,91+140-1); // 左側用・大(2)
yDefSprite(841,107,91,110,91+140-1); // 右側用・大(2)

yDefSprite(842,102,91,105,266-10); // 左側用・大(3) for result
yDefSprite(843,107,91,110,266-10); // 右側用・大(3)

// 白いアルファベット
yDefSprite(850,1,91,9,108); // A
yDefSprite(851,11,91,19,108); // B
yDefSprite(852,21,91,29,108); // C
yDefSprite(853,31,91,39,108); // D
yDefSprite(854,41,91,48,108); // E
yDefSprite(855,1,110,9,127); // F
yDefSprite(856,11,110,19,127); // G
yDefSprite(857,21,110,29,127); // H
yDefSprite(858,31,110,33,127); // I
yDefSprite(859,35,110,43,127); // J
yDefSprite(860,45,110,53,127); // K
yDefSprite(861,1,129,9,146); // L
yDefSprite(862,11,129,21,146); // M
yDefSprite(863,23,129,31,146); // N
yDefSprite(864,33,129,41,146); // O
yDefSprite(865,43,129,51,146); // P
yDefSprite(866,1,148,9,165); // Q
yDefSprite(867,11,148,19,165); // R
yDefSprite(868,21,148,29,165); // S
yDefSprite(869,31,148,39,165); // T
yDefSprite(870,41,148,49,165); // U
yDefSprite(871,1,167,9,184); // V
yDefSprite(872,11,167,21,184); // W
yDefSprite(873,23,167,31,184); // X
yDefSprite(874,33,167,41,184); // Y
yDefSprite(875,43,167,51,184); // Z
yDefSprite(876,1,186,9,203); // "/"
yDefSprite(877,11,186,13,203); // "."
yDefSprite(878,15,186,17,203); // "!"
yDefSprite(879,19,186,27,203); // "%"
yDefSprite(880,1,205,8,222); // 0
yDefSprite(881,10,205,14,222); // 1
yDefSprite(882,16,205,23,222); // 2
yDefSprite(883,25,205,32,222); // 3
yDefSprite(884,34,205,41,222); // 4
yDefSprite(885,43,205,50,222); // 5
yDefSprite(886,1,224,8,241); // 6
yDefSprite(887,10,224,17,241); // 7
yDefSprite(888,19,224,26,241); // 8
yDefSprite(889,28,224,35,241); // 9

// added by BM98v3.16
yDefSprite(890,53,167,061,184); // @
yDefSprite(891,29,186,37,203); // ?
yDefSprite(892,39,186,41,203); // :
yDefSprite(893,43,186,45,203); // ;
yDefSprite(894,47,186,51,203); // [
yDefSprite(895,53,186,57,203); // ]
yDefSprite(896,52,205,60,222); // ^
yDefSprite(897,37,224,40,241); // (
yDefSprite(898,42,224,45,241); // )
yDefSprite(899,47,224,51,241); // "
yDefSprite(900,53,224,54,241); // '
yDefSprite(901,56,224,57,241); // |
yDefSprite(902,59,224,61,243); // ,
yDefSprite(903,1 ,243, 9,260); // _
yDefSprite(904,11,243,19,260); // ~
yDefSprite(905,21,243,28,260); // =
yDefSprite(906,30,243,37,260); // -
yDefSprite(907,39,243,47,260); // +
yDefSprite(908,49,243,56,260); // *

yDefSprite(910,245,185,270,201); // 1P
yDefSprite(911,272,185,297,201); // 2P
yDefSprite(912,299,185,324,201); // 暗い表示の「1P」
yDefSprite(913,326,185,351,201); // 暗い表示の「2P」

// ネオン系 B:Blue R:Red D:Dark T:Top C:Center B:Bottom
for(i=0;i<9;i++){
yDefSprite(920+i,428,1+i*41,458,40+i*41);
// RT,RC,RB,BT,BC,BB,DT,DC,DB
}

// 赤文字の小さいの(BPM用)
yDefSprite(930,317,213,323,227); // 0
for(i=931;i<=939;i++){
yDefSprite(i,245+(i-931)*8,213,251+(i-931)*8,227);
}

yDefSprite(940,112,246,157,267); // sakata

for(i=0;i<3;i++){
yDefSprite(941+i,175,54+i*6,194,58+i*6); // 金色オブジェ
}
yDefSprite(944,154,66,173,70);
yDefSprite(945,207,64,231,70);

for(i=0;i<6;i++){
yDefSprite(946+i,166,192+i*6,185,196+i*6);
// 946 赤・947 緑・948 灰・949 くろ・950 bm98・ 951金色
}

}

 

基本的に、BMRでも、Extended Object/Chracterの機能は持たせるつもりではいるが、もうちょっと洗練されたものにする予定でいる。

なお、ここにある機能を使うと、曲データとして、BM98曲データフォーマットに準拠したものではなくなるため、他のBM98用のビュアー等で見ることができなくなることを、あらかじめお断りしておく。

以上。

 

戻る