この文書は“BMS V2 Project.odt”を非公式に日本語に翻訳したものです。この翻訳の正確さは保証されません。この翻訳は二次著作物であり、原著作権は原著作物に帰属するものです。

BMS 2.0スクリプト

1. はじめに

このスクリプトは、著作権に関係なく、ユーザが自由に音楽ゲームを楽しむことができるスクリプト‘Be-Music Script (以下BMS)’を、より多くの機能と演出ができるようにいくつかのシステムを追加して、より自由な編集とゲームプレイができるように設計されたスクリプトです。このスクリプトは現存する多くのリズムゲームを参照して作成された、より利用しやすくなったスクリプトです。

これはテストを経ていないスクリプトとして、使用時に異常が発生することがあります。このスクリプトを使用する基本プログラムを開発してくださる方が必要です。技術協力はいくらでも可能で、代わりにプログラム実行時にスクリプトで動作するすべての機能を無料でくだされば幸いです。

開発の詳細お問い合わせが必要な方は下記のサイトおよび連絡先にご連絡ください。

音楽ゲーム研究所 MusicGameLAB

音楽ゲーム研究所 サイト
http://cafe.daum.net/musicgamelab
音楽ゲーム研究所 ゲームラウンジ
http://cafe.daum.net/createRHYTHM
音楽ゲーム研究所 Twitter
@MusicGameLAB
音楽ゲーム研究所 日本支部
@MusicGameLABJP
研究所長 メール
softksk@gmail.com

2. 基本条件

スクリプトは、既存のスクリプトを使用可能でありながら、新しい命令も使うことができる。

スクリプト自体がゲームを自由に調整することができる。

3. 基本技術情報

BMS 2.0で既存のスクリプトでも互換性に問題のない範囲で、いくらでも活用が可能なシステム。範囲が拡張されただけに、このスクリプトは必要なチャンネルだけを選んで使うこともできる。

既存のスクリプトと併用する際も、以下の情報を記述することによりBMS 2.0の機能を使用できる。

A. プレイヤー区分

ゲームに必要なプレイヤーを直接登録して使用する。このシステムの理由は、単一のゲームを多くのプレイヤーが同時にプレイする場合のための方法である。

  1. SYSTEM
    コンピュータが直接に自動演奏する。
  2. Player
    ゲームプレイヤーが直接動いて演奏する。
  3. A.I.
    人工知能や保存された履歴データを使用して演奏する。

上記の3つのタイプのプレイヤーがあり、その登録方法はこうだ。

*---------------------- HEADER FIELD
#PLAYER1 PLAYER
#PLAYER2 PLAYER
#PLAYER2 COMPUTER
#PLAYER3 COMPUTER

ここに登録するすべてのプレイヤーは、プレイヤーの番号(#PLAYER?)に基づき全員が別個のプレイヤーとして演奏し、ゲームの文脈が互いに異なる場合でさえ同時に演奏を成立できる。(例: GuitarFreaks vs DrumManiaのセッションプレイ)

ユーザが直接ゲームを楽しむならPLAYERを、でなければCOMPUTERを表示して登録する。#PLAYER1からZまでの35人分を登録できる。

PLAYERはゲームプレイヤー1人が必要だと示す。ネットワークプレイも含め、ユーザがリアルタイムで直接入力するすべてのケースに該当する。プレイヤーなしではゲームを進行できない。

COMPUTERはコンピュータプレイヤーを1人分登録する。コンピュータの判断やリプレイゲームデータを代わりに使う場合も含め、コンピュータが直接演奏するすべての場合を指す。

PLAYERと値COMPUTERが一緒に登録されている場合、PLAYER不在時にCOMPUTERが代わりに活動できる。

B. データベース表示

含めるファイルや情報が多くなるので、迅速な情報検索のためにこのような情報を含めることになった。ゲームの互換性の問題から、プレイヤーがゲームに必要な情報を十分にプログラムに通知するために、この方法を使うことになった。

  1. 既定のデータベースの名前紹介

    *---------------------- DATABASE FIELD
    #WAV00 SOUND (音声)
    #BMP00 PICTURE (画像)
    #WBMP00 MASK (マスク *.bmp)
    #ANI00 MOVIE (動画)
    #BPM00 BPMSPEED (曲のBPM)
    #GROUP00 NOTEGROUP (グループ)

    このデータベースは、00からZZまでのデータを作ってデータフィールドで直接データが使われるすべてのものを示す。これら以外のデータはすべて、ゲームの基本的なタグ情報および不変の基本情報である。

  2. データベースを用いて使用するリソースを登録

    データベースで使用するものを明示したら、以降でその内容を作成すればよい。

    ヘッダ領域と同様にすべての内容が先頭にあるので、十分に区分もうまくいきながらリソースもたやすく登録できる。大きな問題はないだろう。

    *---------------------- DATABASE FIELD
    #WAV00 SOUND
    #WAV01 xxxx.wav
    #WAV02 xxxx.wav
    #WAV03 xxxx.wav
    
    #BMP00 PICTURE
    #BMP01 xxxx.bmp
    #BMP02 xxxx.bmp
    #BMP03 xxxx.bmp
    …
  3. 既存のスクリプトと併用する場合

    既存のスクリプト(#WAV, #BMP, #STOP, #BPMなどのリソース)を使用する場合、デフォルトで使用するチャンネルはすべてのアプリケーションで自動的に認識しているので、あえてデータベースフィールドに既存のスクリプトの情報まで入力しなくてもよい。

C. 3文字で示されるチャンネル番号

既存スクリプトは2文字の英数字で合計1296個のチャンネルを使ったが、プログラムごとに指定されたチャンネルのみを使用でき、

  1. チャンネルフィールドの作成とチャンネル登録

    *---------------------- CHANNEL FIELD
    #CHSPD 0 SPEED
    #CHLNG 0 N
    #CHSBT 0 T
    #CH011 1 WAV
    #CH021 2 WAV
    #CH031 A WAV
    #CH041 B WAV
    #CHSPD
    チャンネル番号SPDを使用することを表す。
    0
    担当プレイヤー番号(ヘッダで登録した#PLAYER?)を指定する。0はSYSTEMカテゴリ。
    SPEED
    基本的に使用するデータを選択する。(例: #SPEED01から#SPEEDZZ)

    内容2行目のNはノートデータではなく、一般的な数値を入力することができ、3行目のTは、自由に文字を入力することができる。

    各チャンネルごとに使用者番号が決められているだけに、各プレイヤーがどのようなデータ、どのようなチャンネルを使うのかを表示することで、ゲームがどのような特性を持つのか知ることができる。または、必要なプレイヤーの情報だけを選んで使用することも可能だ。

  2. チャンネルの使用

    *---------------------- DATA FIELD
    #001SPD:00010002
    #001LNG:2
    #001SBT:Game is started.

    チャンネル番号を3桁に変更して、より自由な編集環境で、より多くの改造が可能であり、既存のスクリプトとまったく重ならない既存の互換性を追求する人々にも有用である。

  3. チャンネル併用可能

    *---------------------- CHANNEL FIELD
    #CH011 1 WAV
    #CH011 1 GROUP

    チャンネルを併用できる。ただし、該当するすべてのチャンネルに対して01からZZまでのデータが一つも重ならない場合のみ。

4. 付加機能開発

この内容以後はBMS 2.0でのみ使用できる特別な機能を作成した。既存では見られない機能を実現することができるように用意した。

A. オートメーションノート(次第に変化するデータを実現)

最近様々なゲームでドラッグをするロングノートを使用しているゲームが増えてきて、また、ゲーム自体にもなだらかな数値の変化のために様々なノートを手動で入力して使用している場合があり、これを簡単に使用するために作られた。

*---------------------- AUTOMATION FIELD
#A001 D   ← "D"という既定値を表示
#A002 2   ← 必ず数字だけ入力
#A003 0.5 ← 数字入力中小数可能, 修飾(数式)は不可能
#A004 1   ← 100%を入力できないので代わりに1を入力
#A00Z 0   ← 0とD(既定値)は実質的には別のデータだ
#A00X X   ← オートメーション急変用の, 以前の値維持用ノート

#A???はオートメーションデータ情報のために使用されるもので、Aに限らずA-Zの英字で始まる4桁の英数字の値を使用する。このデータですべてのヘッダーとは別の登録を持たずに使用できる。使用するとき、#を除いた残りすべてを正確に指定する必要がある。

#[A-Za-z]([0-9A-Za-z]{3}) ??

#AUTO01 A001      ← #を除いた残りすべてを指定する(D = Default = 0%)
#AUTO02 A003 A00Z ← 直角移動. 前(50%), 後(0%)
#AUTO03 A00X A004 ← 前(以前の値維持), 後(100%)
#AUTOA1 "LOWPASS"
#AUTOB1 "HIGHPASS"

オートメーションノートは、#Aヘッダーの情報を取ったり、コードを書いて使用する。

*---------------------- CHANNEL FIELD
#CHAN1 AUTO
#CHAN2 AUTO

*---------------------- DATA FIELD
#001AN1:A1010000000000000000000000000000
#001AN2:B1 ← コード名があるノートだけ使っても構わない
#002AN1:03
#002AN2:01
#003AN2:03

データを指定する方法は、専用チャンネルを作成した後、アナログノートなら必要なプラグインコマンドと、1個または2個の数値を指定する。

オートメーションの使用の終わりを明示しなくてもよい。コード名が書かれたデータが使われれば、その直前のノートを最後の点とし、新しいオートメーションが生成される。ただし、コード名があるノートを連続して2回指定することはできない。

B. ノートグループの技術

反復パターンの作成が捗るのはもちろんのこと、ノートを演奏することで付加的なアニメーション演出や効果音を望むとき、この機能を使用できる。

  1. ヘッダにグループを登録

    *---------------------- DATABASE FIELD
    #GROUP00 NOTEGROUP
    #GROUP01 <GROUP>

    グループ番号と<GROUP>を入力する。

  2. グループデータフィールドの作成およびデータ入力

    *---------------------- GROUP01 DATA FIELD
    #GROUP01001***:(data)
    #GROUP01
    グループ番号01。HEADER FIELDに登録した番号のとおり使用。
    001
    001小節。DATA FIELDとは異なり、グループ内の小節番号。
    ***
    チャンネル。DATA FIELDと同じように使用する。
  3. チャンネル結合のためのガイド

    グループノートを入力する場所がプレイヤー領域にある場合、プレイヤーが直接グループノートを演奏するグループノート内の情報を利用することができる。

  4. ノートが重なる時の優先順位およびその問題

    ノートが重なった場合は、チャンネル番号が高いものを優先的に動作するようにする。

C. 領域ジャンプと停止

特定の領域をジャンプしてゲームプレイヤーには停止された画面だけを示すようにして、その時間だけ別のアニメーションや音楽が再生できるようにする。

#STOPAREAAA STOP
#STOPAREAZZ END
#CHSTA STOPAREA

STAチャンネルのデータAAを入れてから停止を開始してZZを入れるまでの区間まで、ゲームノートの画面上にはこの部分が抜けたままZZ以降のノートが見えるが、その時から停止して動かない。その区間中も、ゲームのアニメーションと音楽は引き続き再生され続けている。

D. 強制的な小節分割

審美的な効果のために使用することで、専用チャンネルを使用して分割する。

#CHSEP <ANYDATA>
#001SEP 0011

ちなみに特別にデータを作成する必要はなく、00以外のデータを指定するだけで小節線を描画できる。小節線の描画は、ユーザにただプレッシャーを与えるために使われる機能なので、小節自体に対して

text seems to have broken off on the way

E. 小節の既定のプロパティを指定可能

最初の小節から引き続き使用する場合、デフォルトで使用する設定を再指定することなく、未設定のプロパティチャンネルに対して再利用可能にするために#DEFAULT小節を作る。ただしこの小節では、一度も使われなかったチャンネルに対してのみ既定値を適用するよう、再利用を抑制する。

#DEFAULTBPM 01
#DEFAULTSPD 01
#DEFAULTLNG 01

5. 拡張機能の開発

A. ゲームの速度の強制変更

ゲームの進行速度を強制的に調整できる。使用方法は先述のオートメーションと似ている。

*---------------------- SPEED FIELD
#X001 100
#X002 200
#X003 1000
#X004 10
#C001 120
#C002 240
#C003 1200
#C004 12

#SPEED01 X001
#SPEED02 X002
#SPEED03 PREV X003
#SPEED04 PREV C004
#SPEEDZZ "BREAK"

*---------------------- CHANNEL FIELD
#CHSPD SPEED
*---------------------- DATA FIELD
#001SPD:0102
#002SPD:0304
#003SPD:ZZ01

使用方法はオートメーションと同様だが、データは定められたもののみを使用しなければならない。#X, または#Cで始まるデータを使って、各特性に合わせて倍率を自由自在に作ることができる。値を指定する方法は2つあり、特殊なコマンドがある。

#X倍率
音楽の速度に指定された数だけ乗じて倍率を高める。100を基本速度とし、数値が高いほどスクロールが高速化し、100以下ならより低い速度に調整することができる。
#C倍率
数値は一つのBPM値であり、音楽の再生速度を問わず、スクロール速度を強制的に調整する。ユーザのゲーム設定速度とは全く関係なく、指定値が強制的に適用される。

この2つのデータを#SPEEDで使用できる。#SPEED#AUTOとは異なり、1個のデータを指定すると即座に適用されることを基本とする。倍速を徐々に上げ下げしたいなら“PREV”を指定してデータを入力すれば、直前のスピード情報に合わせて値が徐々に変わるようになる。

#001SPD 01   ← 1倍速に設定する
#002SPD 02   ← 2倍速に設定する
#003SPD 03ZZ ← 先に配置した2倍速から, 設定された10倍速まで, 徐々に増加

ZZは必須のノートで、前の配置から後の配置へ向かう値の漸次変化の終了地点を定める。このとき、ゲーム上では後方に配置された値を引き続き維持することになる。

BPMオートメーション

上記と同じ方法を使用するが、#Cのみを使用して表現する。#Xは使用できない。

#BPMSPEED01 C001
#CHBPM BPMSPEED
#001BPM 01

B. 多重アニメーション(まだ準備中)

この節の内容は作成中のものです。

  1. 使用する画像を登録する。

    #BMP01 xxxxxx.bmp (画像ファイルのみ使用可能)
    #BMP02 xxxxxx.bmp
    #BMP03 xxxxxx.bmp
    #BMP04 xxxxxx.bmp
    #BMP11 xxxxxx.bmp
    #BMP12 xxxxxx.bmp
    #BMP13 xxxxxx.bmp
    #BMP14 xxxxxx.bmp
    #BMP21 xxxxxx.bmp
    #BMP22 xxxxxx.bmp
    #BMP23 xxxxxx.bmp
    #BMP24 xxxxxx.bmp
    
    #ABMP01 zzzzzz.bmp (白黒だけあるWBMP, 黒い色で透明領域を表示)
    #ANI01 aaaaaa.avi (動画ファイル)

    ゲームでサポートできるならどのようなデータを使用してもかまわない。

    #CHA01 0 BMP ← DEFAULT BACKGROUND アニメーション
    #CHA02 1 BMP ← PLAYER1 BASE アニメーション
    #CHA03 2 BMP ← PLAYER2 BASE アニメーション
    #CHA04 1 BMP ← PLAYER1 BASE2 アニメーション
    #CHA11 0 BMP ← DEFAULT LAYER アニメーション
    #CHA12 1 BMP ← PLAYER1 LAYER アニメーション
    #CHA13 2 BMP ← PLAYER2 LAYER アニメーション
    #CHA14 1 BMP ← PLAYER1 LAYER2 アニメーション
    #CHA21 0 BMP ← DEFAULT LAYER2 アニメーション (チャンネル番号が高いほど上層)
    
    #CHB02 1 ABMP ← PLAYER1 BASE マスク
    #CHB03 2 ABMP ← PLAYER2 BASE マスク
    #CHB04 1 ABMP ← PLAYER1 BASE2 マスク
    #CHB11 0 ABMP ← DEFAULT LAYER マスク
    #CHB12 1 ABMP ← PLAYER1 BASE マスク
    #CHB13 2 ABMP ← PLAYER2 BASE マスク
    #CHB14 1 ABMP ← PLAYER1 BASE2 マスク
    #CHB21 0 ABMP ← DEFAULT LAYER2 マスク
    
    #CHA01 0 ANI (A01チャンネルで, 画像または動画を重なって使用)

    上記のPLAYER1またはPLAYER2のアニメーションは、プレイヤーが正確に演奏している状態を基本とする。もしユーザがミスをしたと判定されたなら、それに対応するミスアニメーションを再生することができる。

    PNG画像ファイルの場合は自主的に透明な表示がされているので、#ABMPを使用しなくても透明機能を使用できる。もちろん、PNGを使用しつつ#ABMPで再度切り出すこともできる。チャンネル登録および対象プレイヤー設定がされていれば、ユーザのプレイに合わせた演出ができる。

  2. グループ化によるアニメーションの配列登録

    #AGROUP01
    #AGROUP02
    #AGROUP03
    
    #AG01001AN0 01020304
    #AG02001AN1 11121314
    #AG03001AN2 21222324

6. 実装例

A. 対象ゲーム: REFLEC BEAT (コナミ)

REFLEC BEATは2人のプレイヤーがボール(=ノート)をやりとりしながら楽しむゲームだ。

ゲームの基本的な特性

  1. ノート

    1. 当てると跳ね返るノート(曲がったり分裂したり高速化したり)
    2. 当てるとその場から消えるノート
    3. 同時押しノート
    4. 長押しロングノート
    5. 同じ場所に連続して入力するチェインノート
    6. 2TOP/3TOPノート
  2. システム

    1. 1個の音源のみを使用
    2. 降りてくるノートの配列が毎回異なる
    3. 相手とリアルタイムで対戦

スクリプト予想も

*---------------------- HEADER FIELD (2人のプレイヤー+システム)
#PLAYER1 PLAYER
#PLAYER2 PLAYER
#PLAYER2 COMPUTER
#TITLE REFLECT BEAT TEST SCRIPT
#STAGEFILE xxxxx.bmp (基本スクリプト)

*---------------------- DATABASE FIELD (データ登録)
#WAV00 SOUND
#WAV01 xxxx.wav (曲)

#BPM00 BPMSPEED
#BPM01 172
#BPM02 86

#NOTE00 NOTETYPE
#NOTE01 NORMAL   ← 消滅するノート
#NOTE02 ATTACK   ← 攻撃できるノート
#NOTE03 BREAK    ← チェインセパレータ
#NOTE04 LONGNOTE ← ロングノート作成

HEADER FIELDにはゲームの基本的な属性だけ詰め込み、さらにプレイヤーの情報が追加された。PLAYER1は必ずゲームを実際に行う人でなければならず、PLAYER2はコンピュータが代わりにプレイすることができる。

ゲームの特性のために専用のコマンドを使用して、それに合ったコード命令を挿入した。

ノートが跳ねていくのは、攻撃可能ノートを当てると、次の小節にあるノート情報を呼び起こす。攻撃ノートは次の小節にノートのデータがある場合にのみ使用できる。

ロングノートは、同じノートを同じ列で2回押せばよい。もし同時に多数のロングノートを入力する必要があれば、チャンネル番号をさらに1行作って使用する。チェインノートも列数区分する。最大の長さが1小節以上を超えないようにする。小節長を調整してチェーンを増量すれば良いだろう。

*---------------------- CHANNEL FIELD
#CH001 0 WAV
#CHLNG 0 N (小節長)
#CHBPM 0 BPM
#CHSPR 0 N (小節セパレータ)
#CHP11 1 NOTE (一般)
#CHP12 1 NOTE (チェインノート)
#CHP13 1 NOTE (2TOP1)
#CHP14 1 NOTE (2TOP2)
#CHP15 1 NOTE (3TOP1)
#CHP16 1 NOTE (3TOP2)
#CHP17 1 NOTE (3TOP3)

一般的なノート(P11), チェインノート(P12), そして2TOP/3TOPチャンネルで区分する。2TOP/3TOPは元のゲームでもランダムを使用せず決まった通り動くので、各ボタンの数だけ全部のチャンネルを作成して使用する。もちろん2TOP/3TOPにはチェインノートが使われない。

#CHP21 2 NOTE (一般)
#CHP22 2 NOTE (チェインノート)
#CHP23 2 NOTE (2TOP1)
#CHP24 2 NOTE (2TOP2)
#CHP25 2 NOTE (3TOP1)
#CHP26 2 NOTE (3TOP2)
#CHP27 2 NOTE (3TOP3)

2Pの場合ももれなく作らなければならない。ノートが全部同時に出てくるのではなく、やりとりするのに近いほど配列されるのに、同じチャンネル配列で同じように作らなければならない。

*---------------------- DATA FIELD
#001001:01
#001BPM:01
#001SPR:2
#001LNG:1
#001P11:0202
#002P21:0202

1Pが跳ねるノートを2回打てば、2Pもその跳ねたのを2回打つ。すべて攻撃が可能だ。

#003P12:0100010001000200
#003P12:0001000100010002

1Pは、2個のチェインノートを4個ずつ順番どおり押す。

#004P21:04
#004P22:01040402
#005P21:04

1Pは、1個の長いロングノートを押した状態で、チェインノートで「一般、ロングノート、攻撃ノート」の順に押す。

#006P13:01020102
#007P23:01020102
#008P13:0404
#008P14:00000400
#009P14:04
#009P23:0404
#009P24:000400
#010P24:04

2TOPノートを演奏する方法の例。007小節では互いにボタンを押して、008小節では1Pがロングノートを二度押して、009小節では2Pがロングノートを二度押す。