TypingMania for offline
SightSeekerStudio.com - TYPINGMANIA 4
{friend:dmp}がやっていたので、やってみようとしたらその日に公開が中止されていたやつ。
とても悔しかった、ローカルで動かしてやった。あとで勝手に歌詞を追加してやる。
(解析結果をあとで書く)
で、結局歌詞は次のような形で入ってる。
<?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?> <musicname>mpegoneaudiolayerthreedata/fragment</musicname> <saidaimondaisuu>10</saidaimondaisuu> <nihongoword>@</nihongoword> <nihongoword>落とされたこの世界は 終わりの無い階段</nihongoword> <nihongoword>その先で君は眠ってるの?</nihongoword> <nihongoword>過去 未来 そして今も 希望の無い階段</nihongoword> <nihongoword>僕たちの時間は何処にあるの?</nihongoword> <nihongoword>繋がるはずだった手と手は いつしか</nihongoword> <nihongoword>遠く引き離されたまま 時は止まったままで</nihongoword> <nihongoword>温もりだけ 今も生きてる</nihongoword> <nihongoword>偽りの愛に 人は皆魅せられ</nihongoword> <nihongoword>鳥篭の中で幸せに生きている</nihongoword> <nihongoword>@</nihongoword> <word>@</word> <word>おとされたこのせかいはおわりのないかいだん</word> <word>そのさきできみはねむってるの</word> <word>かこみらいそしていまもきぼうのないかいだん</word> <word>ぼくたちのじかんはどこにあるの</word> <word>つながるはずだったてとてはいつしか</word> <word>とおくひきはなされたままときはとまったままで</word> <word>ぬくもりだけいまもいきてる</word> <word>いつわりのあいにひとはみなみせられ</word> <word>とりかごのなかでしあわせにいきている</word> <word>@</word> <interval>11570</interval>11570 <interval>5940</interval>17510 <interval>5730</interval>23240 <interval>6160</interval>29400 <interval>6400</interval>35800 <interval>8930</interval>44730 <interval>7780</interval>52510 <interval>6420</interval>58930 <interval>11890</interval>70820 <interval>12040</interval>82860
なんだ、この似非XMLは。
msort.rb
30分シリーズ、その6。ネタ切れしたら、アルゴリズムの本を取り出せばいいことに気がついた。
ということで今回はマージソート。
$ ruby msort.rb オリジナル:[41, 26, 21, 26, 53, 93, 33, 11, 37, 25] 正順ソート:[11, 21, 25, 26, 26, 33, 37, 41, 53, 93] 逆順ソート:[93, 53, 41, 37, 33, 26, 26, 25, 21, 11]
def merge(lhs,rhs,&block) return rhs if lhs.empty? return lhs if rhs.empty? cmp = block ? block.call(lhs[0],rhs[0]) : (lhs[0] <=> rhs[0]) if cmp <= 0 [lhs[0]] + merge(lhs[1..-1],rhs,&block) else [rhs[0]] + merge(lhs,rhs[1..-1],&block) end end def msort(items,&block) return items if items.size == 1 before = items[0...items.size/2] after = items[items.size/2..-1] merge msort(before,&block),msort(after,&block),&block end # テストデータ生成 array = (1..10).map{ rand(100) } # 表示 puts "オリジナル:#{array.inspect}" puts "正順ソート:#{msort(array).inspect}" puts "逆順ソート:#{msort(array){|a,b| b <=> a }.inspect}"
配列をリストとして扱おうとして、ところどころに無理がでてる。というか、標準ライブラリにリスト入れてくれないかな。
TypingManiaのディレクトリ構成
SightSeekerStudio.com - TYPINGMANIA 4がどのような構成になっているかの解析結果。
ディレクトリ構成
ファイル名 | 説明 |
---|---|
XML/* | 歌詞データ。書式は後述 |
mpegoneaudiolayerthreedata/* | 音楽データ。MPEG-1 Audio-3 dataの意味だろう |
tm.swf | typingmania.swfをロードするだけのフラッシュ。たぶん、プログレスバーの表示? |
typingmania40.swf | ゲーム本体 |
musiclist.xml | 歌のデータ。曲名やジャンル、難易度などを指定する。書式は後述 |
書式
歌詞データ
<?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?> <musicname>mpegoneaudiolayerthreedata/fragment</musicname> <saidaimondaisuu>10</saidaimondaisuu> <nihongoword>@</nihongoword> <nihongoword>落とされたこの世界は 終わりの無い階段</nihongoword> ..... <word>@</word> <word>おとされたこのせかいはおわりのないかいだん</word> ..... <interval>11570</interval> <interval>5940</interval> .....
は、mp3データを指しているっぽい。 は問題の数。「最大問題数」だろう は歌詞(漢字)。なにも表示しない場合は@が使われる は歌詞の読み。ひらがなとスペースのみが許される。英字、カタカナ、句読点は許されない はその歌詞を表示しているミリ秒 - nihongoword/word/intervalは先頭から順に対応していく
たぶん、こう書いたほうが分かりやすい。
<?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?> <musicname>mpegoneaudiolayerthreedata/suika</musicname> <saidaimondaisuu>39</saidaimondaisuu> <nihongoword>@</nihongoword> <word>@</word> <interval>3009</interval> <nihongoword>ゆらり揺れる夏の陽炎</nihongoword> <word>ゆらりゆれるなつのかげろう</word> <interval>5075</interval>
musiclist.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <musicinformation> <musicinfo id="0" xmlpath="XML/fragment.xml" musicpath="mpegoneaudiolayerthreedata/fragment.mp3"> <musicname>fragment</musicname> <artist>onoken</artist> <genre>pops ( http://www.axsword.com/ )</genre> <level>04</level> </musicinfo> <musicinfo id="1" xmlpath="XML/ythm.xml" musicpath="mpegoneaudiolayerthreedata/ythm.mp3"> <musicname>ythm</musicname> <artist>onoken</artist> <genre>pops ( http://www.axsword.com/ )</genre> <level>05</level> </musicinfo> </musicinformation>
こちらはちゃんとしたXML。
- musicinfo@idは先頭からの通し番号。これで表示順を決めている
- musicinfo@xmlpathは歌詞データのパス
- musicinfo@musicpathは音楽データのパス
- mussicname、artist、genre、levelはそれぞれ曲名、アーティスト名、ジャンル、難易度