#!/usr/bin/env ruby -Ks =begin = レーサー集計 Racer Totalize = SERA集計 Selfishly Emperium Racing Association Totalize 攻城戦過去ログを一括処理して集計結果を作成します。 == 入力 === 開始日付(未入力の時:マイグレ直後; 2004/05/23) === 終了日付(未入力の時:実行した日) === ワールド名(鯖名) === 攻城戦ログ形式(ropp, time, timetableなど) === 出力形式(txt, html, htmllink, wiki) === 占領砦の表示(0:OFF/1:ON) ===
小数点下の表示させる桁数 0の時は、整数だけを表示する。 === 何日前、未入力なら'0'を自動指定(前回の砦別リスト日付) === param 1. 平均、合計を出力するかどうか (ON:2,3 /OFF: 0,1) 2以上/1以下 2. 空白を0で埋めるかどうか (ON:1,3 /OFF: 0,2) 奇数/偶数 == 出力 racer, sera, timetable, fort, guild, stat _YYYYMMDD.html == 説明 ファイル名にある日付(年月日)を読み取る。 占領砦順番 防衛時間の算出とROWikiランキング 前提条件:攻城戦ログは時系列でソート済 == 砦別リスト === 出力 平均防衛時間 陥落回数 商業値下降 最終的な砦主 完全防衛/落城後奪還/なし == ギルド別リスト === 出力 総防衛時間 平均防衛時間 占領回数 =end require 'gvglib.rb' start_day = ARGV[0] # 開始日付 end_day = ARGV[1] # 終了日付 world = ARGV[2] # ワールド名(鯖名) in_format = ARGV[3] # 形式(ropp, time, timetableなど) out_format = ARGV[4] # 出力形式(html, txt, wiki) breakfort = ARGV[5].to_i # 占領砦表示(0:OFF/1:ON, 数字型) figure = ARGV[6].to_i # 数字の桁数(数字型) before_date = ARGV[7].to_i # 数字型:何日前か(参照する日付) if ARGV == [] # 引数が何も指定されていない時 print RACER_COMMAND, "#$0
: 開始日付(未入力の時:マイグレ直後; 2004/05/23) : 終了日付(未入力の時:実行した日) : ワールド名(鯖名) : 形式(ropp, time, timetableなど) : 出力形式出力形式(txt, html, htmllink, wiki) : 占領砦の表\示(0:OFF/1:ON)
: 数字の桁数(数字型) : 何日前、未入力なら'0'を自動指定(前回の砦別リスト日付) \n" exit end world = check_argv_world(world) # ワールド名チェック in_format = check_argv_logformat(in_format) # ログフォーマット名チェック check_dir("./" + world) # ワールドディレクトリチェック check_dir("./" + world + "/report") # HTMLディレクトリチェック check_dir("./" + world + "/csv") # CSVディレクトリチェック check_dir("./" + world + "/text") # テキストディレクトリチェック check_dir("./" + world + "/wiki") # Wikiディレクトリチェック # 開始日付が 0 の時は DATE['START']['SET'] に設定 start_day = check_argv_day(start_day, DATE['START']['SET']) # 終了日付が 0 の時は今日の日付に設定 end_day = check_argv_day(end_day, Date.today.ymd) start_date = Date.parse(start_day) end_date = Date.parse(end_day) use_datelist = datelist_make(start_date, end_date) # 日付リスト use_datelist = datelist_delete(use_datelist) # 中止日付リスト limit_week = use_datelist.length val = chu = bri = lui = "" average_have = "" # 個別設定 index_path = "./index.html" # インデックスへのリンク(TOPに戻るリンク先) index_up_path = "../index.html" # トップへのリンク(一つ上に戻るリンク先) img_path = "../../img/" # 生成されるHTMLから見たImageディレクトリの場所 css_file = "racer.css" # 使用するCSSファイル css_set = img_path + css_file # HTML内のCSSファイルパス css_read = "./img/" + css_file # スクリプトから見たCSSファイルパス map_file = "mapviewer.js" # 使用するJavaScriptファイル map_set = img_path + map_file # HTML内のJavaScriptファイルパス map_read = "./img/" + map_file # スクリプトから見たJavaScriptファイルパス integer = 0 # 整数の時は0, 小数点下の時は桁数を入れる # 倍率: V C B L (ROWikiランキング用) rate = [0.5, 1.2, 1.5, 1 ] #rate = [1 , 6.5, 9 , 1 ] # Lydiaの場合 if out_format.gsub('html', '') == "link" # htmllink かどうか css = html_head_insert("link", css_set, css_read, "", "") # JavaScript入り css_map = html_head_insert("link", css_set, css_read, map_set, map_read) else css = html_head_insert("", css_set, css_read, "", "") # JavaScript入り css_map = html_head_insert("", css_set, css_read, map_set, map_read) end for count in 0 ... limit_week # 日付個別設定 pickup = reason = ext = "" # 初期化 log_path = "./" + world + "/log/" + in_format + "_" + use_datelist[count][0] + ".txt" if FileTest.exist?(log_path) == false print "攻城戦ログ ", log_path, " は存在しません。\n" next # 次の攻城戦ログファイルへ end if FileTest.size?(log_path) == nil print "攻城戦ログ ", log_path, " のファイルサイズが0です。\n" next # 次の攻城戦ログファイルへ end file_date = Date.parse(use_datelist[count][0]) # 日付取得 now_ymd = file_date.ymd # YYYYMMDD slash_ymd = file_date.ymd_slash # YYYY/MM/DD racer_title = world.capitalize + " レーサー集計 (" + slash_ymd + ")" sera_title = world.capitalize + " SERA集計 (" + slash_ymd + ")" time_title = world.capitalize + " 時系列表\ (" + slash_ymd + ")" fort_title = world.capitalize + " 砦別戦績 (" + slash_ymd + ")" guild_title = world.capitalize + " ギルド別戦績 (" + slash_ymd + ")" stat_title = world.capitalize + " 統計 (" + slash_ymd + ")" # 何も指定しない時は1週間前の日付を設定する if before_date == 0 then before_date = 7 end bef_ymd = (file_date - before_date).ymd bef_ymd = datelist_before(use_datelist, bef_ymd) # 前回の日付(中止前) # IDリンク設定 time_file = "./timetable_" + now_ymd + ".html" fort_file = "./fort_" + now_ymd + ".html" guild_file = "./guild_" + now_ymd + ".html" stat_file = "./stat_" + now_ymd + ".html" # その他、前回砦所有、今回砦所有ファイル other_file = "./" + world + "/log/others_" + now_ymd + ".txt" bef_fort_path = "./" + world + "/log/fortlist_" + bef_ymd + ".txt" now_fort_path = "./" + world + "/log/fortlist_" + now_ymd + ".txt" transfer_path = "./" + world + "/log/transfer_" + now_ymd + ".txt" #------------------------------------------------------------------- # 開始時刻合わせっぽいモノ関連 by Heimdalの集計屋 # start if GVG_TIME['USE_TIME_SET'][0] == 1 time_log_path = "./" + world + "/log/" + "time_" + now_ymd + ".txt" lines = 0 #攻城戦開始[標準]時刻 + 開始マージン時間 GVG_START_MARGIN_B2 = time_add(GVG_TIME['START_DEF'][0],GVG_TIME['START_MARGIN_B'][0]) #GvG時間 = 攻城戦終了[標準]時刻 - 攻城戦開始[標準]時刻 GVG_TIME_LENGTH = time_diff(GVG_TIME['END_DEF'][0],GVG_TIME['START_DEF'][0]) #アナウンス時刻ファイルを読み込み、初回アナウンス時刻を取得 file = open(time_log_path , "r") n1 = file.readlines[0][0..7] while file.gets lines += 1 end file.close #アナウンス時刻ファイルを読み込み、最終アナウンス時刻を取得 file = open(time_log_path , "r") n2 = file.readlines[lines-1][0..7] file.close if timecmp(GVG_TIME['START_DEF'][0],n1) > 0 #初回アナウンス時刻が 攻城戦開始[標準]時刻 以前の場合、 #GvG開始時刻に「初回アナウンス時刻 - START_MARGIN_A」をセット GVG_TIME['START'][0] = time_diff(n1,GVG_TIME['START_MARGIN_A'][0]) elsif (timecmp(GVG_TIME['START_DEF'][0],n1) <= 0) && (timecmp(GVG_START_MARGIN_B2,n1) >= 0) #初回アナウンス時刻が 攻城戦開始[標準]時刻 以後だが、GVG_START_MARGIN_B2以前の場合、 #GvG開始時刻に「初回アナウンス時刻 - START_MARGIN_B」をセット GVG_TIME['START'][0] = time_diff(n1,GVG_TIME['START_MARGIN_B'][0]) end if timecmp(GVG_TIME['END_DEF'][0],n2) < 0 #最終アナウンス時刻が 攻城戦終了[標準]時刻 以後の場合 if timecmp(time_diff(n2,GVG_TIME_LENGTH),n1) < 0 # print time_diff(n2,GVG_TIME_LENGTH)+ "\r\n" # print n1+ "\r\n" #GvG終了時刻からGvG時間を引いた時刻が「初回アナウンス時刻」以前の場合、 #GvG開始時刻に「最終アナウンス時刻 - GvG時間」をセット #GvG終了時刻に「最終アナウンス時刻」をセット GVG_TIME['START'][0] = time_diff(n2,GVG_TIME_LENGTH) GVG_TIME['END'][0] = n2 else #GvG終了時刻からGvG時間を引いた時刻が「初回アナウンス時刻」以後の場合、 #GvG開始時刻に「初回アナウンス時刻 - START_MARGIN_A」をセット #GvG終了時刻に「最終アナウンス時刻」をセット #(明らかに規定時間以上GvGが行われているケース) GVG_TIME['START'][0] = time_diff(n1,GVG_TIME['START_MARGIN_A'][0]) GVG_TIME['END'][0] = n2 end else #最終アナウンス時刻が 攻城戦終了[標準]時刻 以後の場合、 #GvG終了時刻に「GvG開始時刻 + GvG時間」をセット GVG_TIME['END'][0] = time_add(GVG_TIME['START'][0],GVG_TIME_LENGTH) end end #print GVG_TIME['START'][0] + "\r\n" #print GVG_TIME['END'][0] + "\r\n" # end #------------------------------------------------------------------- # 注目レーサー、その他の読み込み(ファイルが存在するとき) if FileTest.exist?(other_file) == true (pickup, reason) = log_read_pickup(other_file) (neta, announce) = log_read_others(other_file) else # ファイルが存在しないときは空白 neta = announce = "" # nil にならないように空白を設定 end if out_format =~ /^html/ ext = ".html" # 拡張子設定 param = 2 # 数字を桁揃えしない、集計あり else ext = ".txt" if out_format == "txt" then param = 2 # 数字を空白で桁揃えする、集計あり else param = 3 end # 数字を0で桁揃えする、集計あり end # 各種結果ファイル racer_html = "./" + world + "/report/" + "racer_" + now_ymd + ".html" sera_html = "./" + world + "/report/" + "sera_" + now_ymd + ".html" time_html = "./" + world + "/report/" + "timetable_" + now_ymd + ".html" fort_html = "./" + world + "/report/" + "fort_" + now_ymd + ".html" guild_html = "./" + world + "/report/" + "guild_" + now_ymd + ".html" stat_html = "./" + world + "/report/" + "stat_" + now_ymd + ".html" racer_txt = "./" + world + "/text/" + "racer_" + now_ymd + ".txt" sera_txt = "./" + world + "/text/" + "sera_" + now_ymd + ".txt" time_txt = "./" + world + "/text/" + "timetable_" + now_ymd + ".txt" fort_txt = "./" + world + "/text/" + "fort_" + now_ymd + ".txt" guild_txt = "./" + world + "/text/" + "guild_" + now_ymd + ".txt" stat_txt = "./" + world + "/text/" + "stat_" + now_ymd + ".txt" racer_csv = "./" + world + "/csv/" + "racer_" + now_ymd + ".csv" sera_csv = "./" + world + "/csv/" + "sera_" + now_ymd + ".csv" rowiki_csv = "./" + world + "/csv/" + "rowiki_" + now_ymd + ".csv" breakguild_csv = "./" + world + "/csv/" + "breakguild_" + now_ymd + ".csv" breakfort_csv = "./" + world + "/csv/" + "breakfort_" + now_ymd + ".csv" racer_wiki = "./" + world + "/wiki/racer_" + now_ymd + ".txt" fortlog = log_read_format(log_path) # 攻城戦ログの読み込みと初期化 # 前回の砦名一覧リストチェック 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 # 砦譲渡があれば、開始前砦所有リストを書き換える。 if FileTest.exist?(transfer_path) == true transferlog = log_read_csv(transfer_path, "\t") bef_fortlist = fortlist_make(bef_fortlist, transferlog) end now_fortlist = fortlist_make(bef_fortlist, fortlog) # 今回の全砦所有リスト # 今回の全砦所有リストと最終占領時間 # now_fortlist = log_read_fortlist(now_fort_path) # ギルド別落城回数リスト作成(ハッシュ) guildlist_breakcount = guildlist_fortlog_breakcount({}, fortlog) # 占領ログからギルド別取得砦リスト(ハッシュ)を作る guildlist_getfort = guildlist_fortlist_getfort(now_fortlist) # 砦を獲得したギルド # 占領ログからギルド別占領砦リスト(ハッシュ)を作る guildlist_announce = guildlist_fortlog_announce(fortlog, "\t") y = x = 0 # イテレータ変数の事前の宣言(高速化用) limit_guild = fortlog.collect{|x| x[3]}.uniq.length # ギルド総数 # ギルド別リスト(占領回数、取得砦、砦占領履歴) # guildlist[0:ギルド名][1:占領回数][2:ランキング][3:獲得砦名][4:占領砦表] # 行数:ギルド数, 列数:5, 初期値:""(ソートの都合上) guildlist = matrix_init(limit_guild, 5, "") # ギルドリスト配列作成 guildlist = guildlist_make(guildlist, now_fortlist, fortlog) # ランキングの前処理:占領回数、砦有り(個数)、ギルド名で、降順ソートする guildlist.sort!{|x, y| [y[1], y[3].length, x[0]] <=> [x[1], x[3].length, y[0]]} guildlist = guildlist_ranking(guildlist) # ギルド別ランキング作成 # SERA集計 攻城戦ログから砦別占領回数のリスト作成 total_break = fortlog.length # 占領総回数(ログの長さ) total_guild = guildlist.length # 登場ギルド総数 fort_breakcount = fortlist_breakcount(bef_fortlist, fortlog) # 砦別占領回数 perfect_defense = fortlist_perfect_defense(fort_breakcount) # 堅守砦リスト # fort_deftime = now_fortlist # 砦別防衛時間 # fort_breaktime = fortlist_timediff(fort_deftime) # 砦別最終占領時間 fort_breaktime = fortlist_breaktime(bef_fortlist, fortlog) # 砦別最終占領時間 fort_deftime = fortlist_deftime(fort_breaktime) # 砦別防衛時間 fort_rowiki = fortlist_ROWikiRank(fort_deftime, rate) # ROWikiランキング計算 average = fortlist_average(fort_breakcount, total_break) defense = fortlist_defense(fort_breakcount, average) race_fort = fortlist_race(defense) # レース会場リスト bprate = fortlist_bprate(fort_breakcount, total_break) min_bprate = fortlist_min_bprate(bprate) odds = fortlist_odds(bprate, defense) # 砦別リスト作成(ハッシュ):時系列用 breaklist = breaklist_fort_start(bef_fortlist, GVG_TIME['START'][0]) breaklist = breaklist_fort_now(breaklist, fortlog) breaklist = breaklist_fort_end(breaklist, now_fortlist, GVG_TIME['END'][0]) # 砦別リスト(配列) fort_array = breaklist_fort_make(bef_fortlist, now_fortlist, fortlog) # ギルド別リスト(配列) guild_array = breaklist_guild_make(bef_fortlist, now_fortlist, fortlog) # ギルド別SERA集計リスト(ハッシュ) guildlist_sera = breaklist_guild_sera(guild_array, odds) # ギルド別RoWikiランキング点数集計リスト(ハッシュ) guildlist_rowiki = guildlist_fortlist_add({}, fort_rowiki) guildlist_longer = breaklist_guild_defense_longer(guild_array) # 最長防衛時間 guildlist_total = breaklist_guild_defense_total(guild_array) # 総防衛時間 guildlist_average = breaklist_guild_defense_average(guild_array) # 平均防衛時間 if out_format =~ /^html/ # HTML形式で出力 link = out_format.gsub('html', '') insert = css path_top = index_up_path racer = File.open(racer_html, "w") # レーサー集計 title = racer_title input = File.read('./template/header.rhtml') input += File.read('./template/racer.rhtml') input += File.read('./template/footer.rhtml') racer.puts ERB.new(input, nil, 1).result(binding()) racer.close sera = File.open(sera_html, "w") # SERA集計 title = sera_title input = File.read('./template/header.rhtml') input += File.read('./template/sera.rhtml') input += File.read('./template/footer.rhtml') sera.puts ERB.new(input, nil, 1).result(binding()) sera.close insert = css_map time = File.open(time_html, "w") # 時系列表 title = time_title input = File.read('./template/header.rhtml') input += File.read('./template/time.rhtml') input += File.read('./template/footer.rhtml') time.puts ERB.new(input, nil, 1).result(binding()) time.close insert = css fort = File.open(fort_html, "w") # 砦別戦績 title = fort_title input = File.read('./template/header.rhtml') input += File.read('./template/fort.rhtml') input += File.read('./template/footer.rhtml') fort.puts ERB.new(input, nil, 1).result(binding()) fort.close guild = File.open(guild_html, "w") # ギルド別戦績 title = world.capitalize + " ギルド別戦績 (" + slash_ymd + ")" input = File.read('./template/header.rhtml') input += File.read('./template/guild.rhtml') input += File.read('./template/footer.rhtml') guild.puts ERB.new(input, nil, 1).result(binding()) guild.close stat = File.open(stat_html, "w") # 統計 title = world.capitalize + " 統計 (" + slash_ymd + ")" input = File.read('./template/header.rhtml') input += File.read('./template/stat.rhtml') input += File.read('./template/footer.rhtml') stat.puts ERB.new(input, nil, 1).result(binding()) stat.close # 集計結果をCSVに出力 log_write_csv_fortlist(breakfort_csv, fort_breakcount, "\t") log_write_csv_guildlist(breakguild_csv, guildlist_announce, "\t") log_write_csv_guildlist(racer_csv, guildlist_breakcount, "\t") log_write_csv_guildlist(sera_csv, guildlist_sera, "\t") log_write_csv_guildlist(rowiki_csv, guildlist_rowiki, "\t") elsif out_format =~ /^wiki/ # Wiki Style wiki_racer = File.open(racer_wiki, "w") input = File.read('./template/racer.rwiki') wiki_racer.puts ERB.new(input, nil, 1).result(binding()) wiki_racer.close else # 未入力、その他、テキスト形式 racer = File.open(racer_txt, "w") racer.print racer_title, "\n\n" input = File.read('./template/racer.rtxt') racer.puts ERB.new(input, nil, 1).result(binding()) racer.close sera = File.open(sera_txt, "w") sera.print sera_title, "\n\n" input = File.read('./template/sera.rtxt') sera.puts ERB.new(input, nil, 1).result(binding()) sera.close time = File.open(time_txt, "w") time.print log_line_timetable(fort_array, guild_array) time.close fort = File.open(fort_txt, "w") fort.print log_line_fort(fort_array) fort.close guild = File.open(guild_txt, "w") guild.print log_line_guild(guild_array) guild.close stat = File.open(stat_txt, "w") input = File.read('./template/stat.rtxt') stat.puts ERB.new(input, nil, 1).result(binding()) stat.close end end exit