#!/usr/bin/env ruby -Ks =begin = レーサー点数計算 == 使い方 1. Lydia GvG log (http://ro.ayatan.org/lydgvg/) から http://ro.ayatan.org/lydgvg/log/2005_02_20.i.txt をダウンロードします。 それを Lydia/log フォルダに保存します。 ※2005_02_20.i.txtの文字コードがEUCなので、 WindowsXPで処理する時はSJISに変換します。 2. EUC -> SJIS ruby nkfdate.rb 20050220 0 Lydia/log timetable timetable_20050220.txt が出来ます。 ※i.txt -> timetable ※l.txt -> lydia 3. レーサー点数計算 ruby racer_point.rb Lydia/log/timetable_20050220.txt > racer_point.txt 以上で作成した timetable_20050220.txt を元に計算します。 == 計算方法 1. 21時30分までのブレイクは+1 21時30分以降は+2 但し保持していたギルドと次にブレイクしたギルドが重複した場合+0.5 2. 時間に問わず15分以上防衛していたギルドをブレイクした場合は+3 3. 連続防衛時間は4分毎に+1(注:確保防衛は考慮しない) =end require 'date' require 'gvglib.rb' log_path = ARGV[0] # log.txt(ROPP形式) world = "Lydia" before_date = 0 if ARGV == [] # 引数が何も指定されていない時 print RACER_COMMAND, "#$0 : ログファイル、日付を含む(ropp_YYYYMMDD.txt)\n" exit end start_date = Date.parse(START_DATE) # 開始日付 end_date = Date.today # 今日の日付 use_datelist = datelist_make(start_date, end_date) # 日付リスト use_datelist = datelist_delete(use_datelist) # 中止日付リスト if FileTest.exist?(log_path) == false print "攻城戦ログ ", log_path, " は存在しません。\n" exit end file_date = Date.parse(File.basename(log_path)) # 日付取得(YMD) now_ymd = file_date.strftime('%Y%m%d') # YYYYMMDD slash_ymd = file_date.strftime('%Y/%m/%d') # YYYY/MM/DD # 何も指定しない時は1週間前の日付を設定する if before_date == 0 then before_date = 7 end bef_ymd = (file_date - before_date).strftime('%Y%m%d') bef_ymd = datelist_before(use_datelist, bef_ymd) # 前回の日付(中止前) fortlog = log_read_format(log_path) # 攻城戦ログの読み込みと初期化 # 前回の砦所有リスト bef_fort_path = world + "/log/fortlist_" + bef_ymd + ".txt" # 前回の砦名一覧リストチェック if FileTest.exist?(bef_fort_path) == true # 前回の砦占領リスト bef_fortlist = log_read_fortlist(bef_fort_path) else print bef_fort_path, " は見つかりませんでした。\n" print "前回の結果を初期化して使います。\n" bef_fortlist = fortlist_init('', 0) # 初期化 end now_fortlist = fortlist_make(bef_fortlist, fortlog) # 今回の全砦所有リスト # 砦別リスト作成(ハッシュ) breaklist = breaklist_fort_start(bef_fortlist, GVG_TIME_START) breaklist = breaklist_fort_now(breaklist, fortlog) breaklist = breaklist_fort_end(breaklist, now_fortlist, GVG_TIME_END) # ギルド別落城回数リスト作成(ハッシュ) #guild_fortlog_breakcount = guild_fortlog_breakcount(fortlog, {}) # 砦別リスト作成 #fort_array = breaklist_fort_make(bef_fortlist, now_fortlist, fortlog) # ギルド別リスト作成 guild_array = breaklist_guild_make(bef_fortlist, now_fortlist, fortlog) =begin = レーサー点数計算 == 5回以上コールのギルドを対象 === 21時30分までのブレイクは+1 === 21時30分以降は+2 === 但し保持していたギルドと次にブレイクしたギルドが重複した場合+0.5 === 時間に問わず15分以上防衛していたギルドをブレイクした場合は+3 === 連続防衛時間は4分毎に+1 ※確保防衛は考慮しない =end def guildlist_point(breaklist, breaklist_fort) guildlist = [] line = [] count = limit = limit_break = 0 last_sec = end_sec = def_sec = bef_def_sec = 0 key = value = "" breaklist.each { |key, value| # value[row] = [0:占領時間 1:落城時間 def_time:防衛時間 2:占領した砦 # 3:占領されたギルド 4:占領したギルド] total = 0 # 総防衛時間(秒) point = 0 limit = value.length if value == nil then next # 配列がない場合は飛ばす elsif value[0][0] == GVG_TIME_START # 砦を最初に持っていたら占領数を引く limit_break = limit - 1 else limit_break = limit end if limit_break == 0 then next end # ブレイクなしなら飛ばす for row in 0 ... limit fortname = value[row][2] # 占領砦名 last_sec = str2sec(value[row][0]) # 占領時間(秒) end_sec = str2sec(value[row][1]) # 落城時間(秒) def_sec = end_sec - last_sec # 防衛時間(秒) if row > 0 # 二回目以降 limit_fort = breaklist_fort[fortname].length for fortline in 0 ... limit_fort # 占領時間に一致する占領時間の砦名を探す forttime = breaklist_fort[fortname][fortline][0] bef_forttime = breaklist_fort[fortname][fortline-1][0] if value[row][0] == forttime # 砦の占領時間 bef_def_sec = str2sec(forttime) - str2sec(bef_forttime) # 防衛時間 next # 防衛時間を計算したのでループ脱出 end end if bef_def_sec >= 900 # 相手の防衛時間が15分以上の時 point += 3 end if value[row-1][4] == value[row][3] # ブレイクが交互 point += 0.5 # 今占領されたギルドと1つ前の占領したギルドが同じ else if last_sec == 72000 # 開始時砦所有していた場合 next elsif last_sec < 77400 # 21:30:00以前 point += 1 else # 21:30:00以降 point += 2 end end else if last_sec == 72000 # 開始時砦所有していた場合 next elsif last_sec < 77400 # 21:30:00以前 point += 1 else # 21:30:00以降 point += 2 end end point += (def_sec / 240) # 防衛時間4分おきに1点 total += def_sec # 総防衛時間 end # ギルド名、占領回数、点数、総防衛時間 guildlist[count] = [key, limit_break, point, sec2str(total)] count += 1 } return guildlist end guildlist = guildlist_point(guild_array, breaklist) guildlist_sort = guildlist.sort{|x, y| y[2] <=> x[2]} # 点数で配列をソート =begin == レーサー点数ランキング出力 =end print "順位 ギルド名 ブレイク回数 点数 総防衛時間\n" number = bef_break = bef_point = 0 bef_number = 1 guildlist_sort.each{ |x| if x[1] >= 5 # 5回以上の占領を対象 number += 1 if (bef_break == x[1]) && (bef_point == x[2]) # 点数と占領数が同じの時 number = bef_number # 順位を同じにする end printf("%2d位 ", number) print x[0], " " print x[1], " " print x[2], " " print x[3], "\n" bef_number = number bef_break = x[1] # 前回の占領数 bef_point = x[2] # 前回の点数 end } exit