TypingMania for offline

mzp2007-04-21

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は。

TypingMania用データ変換 開発中

{friend:hmx}やら{friend:dmp}がカラオケ用にぽちぽち打った歌詞データをTypingMania用に変換してやろうと、がんばってます。

  • 英語に対応してません。どうしてくれましょう -> どうしようもない
  • 曲が速すぎて、ぜんぜんクリアできません
  • カラオケ用だったためか、ちょっとだけ歌詞が早く出てくる。直した方がいいのかどうか悩み中->直さないことにした

だいたい完成。あとで解説を書く。

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ディレクトリ内に保存されている似非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はそれぞれ曲名、アーティスト名、ジャンル、難易度

使ったツール

Flare
Mac用もある。ちゃんと逆コンパイルできていないっぽい。ただし今回はこちらで十分だった。
Sothink SWF Decompiler
Windowsのみ。ちゃっんと逆コンパイルできていたっぽい。体験版を使用。