RTA時間計測ツール:rta.rb

RTAのチェックポイントごとのタイムの記録を取るのを楽にするツールを作りましたので公開します。
(ただし、このツールを使ってお使いのコンピュータに不具合が生じても責任を取ることはできませんのであしからず。)

使い方

まず、チェックポイント一覧を改行で区切って入力したテキストファイルを用意します。
例えばこんな感じ。

南の砦で
ギュスターヴの陣営へ
エッグを追って
ラストバトル開始
エッグ撃破
ラストセーブ

このテキストファイルを保存します。(ここではファイル名をsf2check.txtとします)

次に、チェックポイントが書かれたファイル名を引数にしてスクリプトを起動します(Rubyが必要です)

% ruby rta.rb sf2check.txt

するとプログラムが起動し、"Ready?"と表示されます。ここでReturnを押すと"Start!"と表示され、タイム計測開始です。Returnを押すごとに、押した時間が記録され、また画面には次のチェックポイントが表示されます。すべてのチェックポイントでタイムを計測し終わると記録したタイムの表をタブ区切りテキストの形でチェックポイントが書かれたファイルと同じディレクトリに出力します。

実行した時のターミナルの画面はこんな感じになります。(時間の値は適当です。実測値じゃないです。)

% ruby rta.rb sf2check.txt
Ready?

Start!
南の砦で
	00:04:21
ギュスターヴの陣営へ
	00:08:16
エッグを追って
	00:09:40
ラストバトル開始
	00:22:27
エッグ撃破
	00:43:55
ラストセーブ
	00:46:23

使い方は以上です。ソースコードは折り畳んでおきます。

ソースコード

#!/usr/bin/env ruby

class TimeKeeper
  def initialize cl
    @checklist = cl
    @record = []
  end
  
  def start
    @start = Time.now
  end

  def top
    @checklist[0]
  end

  def check
    elapsed = Time.now - @start
    @record.push [@checklist.shift, elapsed]
    elapsed
  end

  attr_reader :record
end

def parse src
  src.split "\n"
end

def ftime_format ftime
  int = ftime.truncate
  sec = int % 60
  min = ((int - sec) / 60) % 60
  hr = (int - min * 60 - sec) / 3600
  format "%02d:%02d:%02d", hr, min, sec
end

def printrecord rec
  checkpoint = rec[0]
  time = ftime_format rec[1]
  "#{checkpoint}\t#{time}"
end
    
class Controller
  def initialize
    @keeper = TimeKeeper.new parse ARGF.read
  end
  
  def ready
    puts 'Ready?'
    $stdin.gets
    puts 'Start!'
    start
  end

  private
  def start
    @keeper.start

    while top = @keeper.top
      print top
      $stdin.gets
      fmt = ftime_format @keeper.check
      puts "\t#{fmt}"
    end
    
    output
  end

  def outfilename
    ARGF.filename + '.out'
  end

  def output
    open outfilename, 'w' do |f|
      @keeper.record.each do |r|
        f.puts printrecord r
      end
    end
  end
end

Controller.new.ready