=begin = 攻城戦ログの読み書き == 攻城戦ログ配列 fortlog[0:行番号][1:占領リスト] [1:占領リスト] = [0:時刻, 1:砦地域, 2:砦番号(数字型), 3:ギルド] == 文字コード 読み書き共にShift_JISを用います。 ソースコード、書き出しは全てShift_JISです。 == 引数 path: 相対ファイルパス(ファイル名) delimiter: 区切り文字(タブ、コロンなど) ymd: YYYY/MM/DD 形式の日付 =end # 注目レーサー # ファイルから項目を読み込みます。改行だけの行を区切りとします。 # 読み込む項目 # ○注目レーサー # 「と」で囲まれている部分全部です。 # 理由:attention # 注目レーサーに決定した理由を読み込みます。 def log_read_pickup(path) file = File.open(path) flag_pickup = 0 pickup = reason = "" while line = file.gets if line =~ /^\n/ next elsif line =~ /^○注目/ flag_pickup = 1 next elsif flag_pickup == 1 if line =~ /^理由/ # 理由: reason = line.gsub(/\n$/, '') flag_pickup = 0 else pickup = line.gsub(/\n$/, '') end end end return pickup, reason end # <その他> # ファイルから読み込みます。改行だけの行を区切りとします。 # 読み込む項目 # ○ネタギルド # ○実際のアナウンス def log_read_others(path) file = File.open(path) flag_neta = flag_announce = flag_special = 0 neta = announce = special = special_reason = "" while line = file.gets if line == "○ネタギルド\n" # 「ネタ」はマッチ演算子が適用不能 flag_neta = 1 next elsif line == "○実際のアナウンス\n" # =~ /^○実際のアナウンス/ flag_announce = 1 next elsif line == "○特別賞\n" flag_special = 1 next elsif flag_neta == 1 if line == "\n" # 改行だけの行を区切りと見なす flag_neta = 0 next else neta += line # ネタギルドの内容 end elsif flag_announce == 1 if line == "\n" # 改行だけの行を区切りと見なす flag_announce = 0 next else announce += line # 実際のアナウンスの内容 end elsif flag_special == 1 if line == "\n" # 改行だけの行を区切りと見なす flag_special = 0 next else special += line # 実際のアナウンスの内容 end end end neta = neta.gsub(/\n$/, '') announce = announce.gsub(/\n$/, '') return neta, announce end ##### FortLog Read: 攻城戦ログ読込 # 形式自動判別 - ログファイル名からログフォーマットを自動判別します。 def log_read_format(path) filename = File.basename(path) # ファイル名の取得 if filename =~ /^ropp_/ then return log_read_ropp(path) elsif filename =~ /^lydia_/ then return log_read_lydia(path) elsif filename =~ /^ses_/ then return log_read_ses(path) elsif filename =~ /^sara_/ then return log_read_sara(path) elsif filename =~ /^chatpon_/ then return log_read_chatpon(path) elsif filename =~ /^bracket_/ then return log_read_bracket(path) elsif filename =~ /^rofx_/ then return log_read_rofx(path) elsif filename =~ /^rocha_/ then return log_read_rocha(path) elsif filename =~ /^timetab_/ then return log_read_csv(path, "\t") elsif filename =~ /^timecsv_/ then return log_read_csv(path, ",") elsif filename =~ /^time_/ # タブは""で囲まないといけない if filename =~ /.txt$/ then return log_read_csv(path, "\t") elsif filename =~ /.csv$/ then return log_read_csv(path, ",") end elsif filename =~ /^timetable_/ then return log_read_timetable(path) elsif filename =~ /^savechat_/ then return log_read_savechat(path, str2sec(GVG_TIME['START'][0]) + 60, str2sec(GVG_TIME['END'][0])) # elsif filename =~ /^pertime_/ then return log_read_pertime(path) elsif filename =~ /^perl_/ then return log_read_perl(path) elsif filename =~ /_ajito.html$/ then return log_read_ajito(path) else print < [Chung-Rim Guild 1] [Guild Name] ギルドが占領しました # [GVG] <20:02:07> [Chung-Rim Guild 1] [Guild Name] ギルドが占領しました # ※[状態] と <時刻>の間は "\t"(タブ)が入ります。 def log_read_chatpon(path) file = File.open(path) fortlog = [] count = fortarea = fortnumber = timedata = guild = 0 line = 0 # 変数の事前宣言(高速化用) while line = file.gets if line =~ /^\n/ then next end # 文頭が改行の時、飛ばす line.chomp! # 改行カット # '#' で以降の文字列をカットされたときの対応 unless line =~ /\] ギルドが占領しました$/ line += "#] ギルドが占領しました" end # [GMM] または [GVG] から始まる行だけを対象にする if (line =~ /^\[GMM\]/) || (line =~ /^\[GVG\]/) line = line.gsub(/^\[GMM\][\t  ]+/, '').gsub(/^\[GVG\][\t  ]+/, '') # 先頭を削除 if line =~ /^\n/ then next end # 文頭に改行がある時は飛ばす # "<時刻>" から始まる行を時刻とメッセージに分割する if line =~ /^\<(\d+:\d+:\d+)\>\s(.+)/ timedata = $1 # 時刻 data = $2 end # 地域名の'-'に対応 if data =~ /^砦 \[(\w+|\w+\-\w+) (\w+) (\d)\].+?\[(.+)\]/ fortarea = $1 + " " + $2 fortnumber = $3.to_i # 数字型 # ギルド名が[]の時は""が代入される guild = $4.gsub(MATCH_WORD, REPLASE_WORD) # ギルド名内の置換 else next end fortlog[count] = [timedata, fortarea, fortnumber, guild] count += 1 end end file.close return fortlog.sort # 時系列ソート end # ブラケット: bracket, データが "[" と "]" で区切られる形式 # [Jan 30 20:02:07 2005][Chung-Rim Guild 1][Guild Name] def log_read_bracket(path) file = File.open(path) fortlog = [] count = fortname = fortarea = fortnumber = timedata = guild = 0 line = 0 # 変数の事前宣言(高速化用) while line = file.gets if line =~ /^\n/ then next end # 文頭が改行の時、飛ばす line.chomp! # 改行カット # '#' で以降の文字列をカットされたときの対応 unless line =~ /\] ギルドが占領しました$/ line += "#] ギルドが占領しました" end # 区切り文字で時間、砦名、ギルドを取り出す line = line.gsub(/^\[/,'').gsub(/\]\n$/,'') # 最初の"["と最後の"]"を削除 (timedata, fortname, guild) = line.split("\]\[") # "][" で分割 # 日付時刻から時刻だけを取り出す。見つからない場合については未考慮 if timedata =~ /(\d+:\d+:\d+)/ timedata = $1 end if fortname =~ /^(\w+|\w+\-\w+) (\w+) (\d)/ # 地域名の'-'に対応 fortarea = $1 + " " + $2 fortnumber = $3.to_i # 数字型 end # split の時、何もない部分は nil になるので空白に置き換える(ソート対策) if guild == nil then guild = "" end guild = guild.gsub(MATCH_WORD, REPLASE_WORD) # ギルド名内の置換 fortlog[count] = [timedata, fortarea, fortnumber, guild] count += 1 end file.close return fortlog.sort # 時系列ソート end # RoFX: rofx # [20:02:07][GMM] 砦 [Chung-Rim Guild 1]を [Guild Name] ギルドが占領しました def log_read_rofx(path) file = File.open(path) fortlog = [] count = fortarea = fortnumber = time = guild = 0 line = 0 # 変数の事前宣言(高速化用) while line = file.gets if line =~ /^\n/ then next end # 文頭が改行の時、飛ばす line.chomp! # 改行カット # '#' で以降の文字列をカットされたときの対応 unless line =~ /\] ギルドが占領しました$/ line += "#] ギルドが占領しました" end # GM から始まる行だけを対象にする if line =~ /^\[(\d\d:\d\d:\d\d)\]/ time = $1 # 時刻 end line.gsub!(/^\[\d\d:\d\d:\d\d\]/, '') # 先頭を削除 line.gsub!(/^\[\w\w\w\]/, '') # [GMM] などを削除 line.gsub!(/^[\s ]/, '') # 行頭の空白を削除 # 地域名の'-'に対応 if line =~ /^砦 \[(\w+|\w+\-\w+) (\w+) (\d)\].+?\[(.+)\]/ fortarea = $1 + " " + $2 fortnumber = $3.to_i # 数字型 # ギルド名が[]の時は""が代入される guild = $4.gsub(MATCH_WORD, REPLASE_WORD) # ギルド名内の置換 else next end fortlog[count] = [time, fortarea, fortnumber, guild] count += 1 end file.close return fortlog.sort # 時系列ソート end # RoCha!!: rocha, ろちゃ!!サポート掲示板, http://chat.ii2.cc/rocha_bbs/ # 2005 01/30 20:02:07 砦 [Chung-Rim Guild 1]を [Guild Name] ギルドが占領しました def log_read_rocha(path) file = File.open(path) fortlog = [] count = fortarea = fortnumber = timedata = guild = 0 line = 0 # 変数の事前宣言(高速化用) while line = file.gets if line =~ /^\n/ then next end # 文頭が改行の時、飛ばす line.chomp! # 改行カット # '#' で以降の文字列をカットされたときの対応 unless line =~ /\] ギルドが占領しました$/ line += "#] ギルドが占領しました" end line = line.gsub(/^(\d\d\d\d) (\d\d)\/(\d\d) /, '') # 先頭を削除 if line =~ /^(\d+:\d+:\d+)[\s ]+/ timedata = $& # 時刻, マッチした部分 data = $' # マッチした部分の次の文字列 end # 地域名の'-'に対応 if data =~ /^砦 \[(\w+|\w+\-\w+) (\w+) (\d)\].+?\[(.+)\]/ fortarea = $1 + " " + $2 fortnumber = $3.to_i # 数字型 # ギルド名が[]の時は""が代入される guild = $4.gsub(MATCH_WORD, REPLASE_WORD) # ギルド名内の置換 else next end fortlog[count] = [timedata, fortarea, fortnumber, guild] count += 1 end file.close return fortlog.sort # 時系列ソート end # Lydia: lydia, Lydia GvG log, http://ro.ayatan.org/lydgvg/ # 砦名 (占領回数) # 時間 ギルド名 def log_read_lydia(path) file = File.open(path) fortlog = [] count = fortarea = fortnumber = timedata = guild = 0 line = 0 # 変数の事前宣言(高速化用) while line = file.gets if line =~ /^\n/ then next # 文頭が改行の時、飛ばす # 砦名 "(0)"(堅守した砦)がある時は飛ばす elsif line =~ /^(V||B||C||L) && \(0\)$/ then next end # Chung-Rim Guild 1 (0) # if line =~ /^(\w+\-\w+|\w+) (\w+) (\d) \(\d+\)/ # 地域名の'-'に対応 if line =~ /^(\w+\-\w+|\w+) (\w+) (\d)/ # 地域名の'-'に対応 fortarea = $1 + " " + $2 fortnumber = $3.to_i # 数字型 next # 砦名の行は飛ばす end # 20:00:00 ギルド名 if line =~ /^(\d\d:\d\d:\d\d)/ timedata = $1 # 時刻 guild = $'.gsub(/^ /, '').chomp # 文頭の空白と最後の改行削除 guild = guild.gsub(MATCH_WORD, REPLASE_WORD) # ギルド名内の置換 end fortlog[count] = [timedata, fortarea, fortnumber, guild] count += 1 end file.close return fortlog.sort # 時系列ソート end # Ses板: ses, Ses板の攻城戦スレに投稿されるログ形式 # [砦名] (元・開始前占領ギルド) # 時間 ギルド名 # 占領回数: 回 def log_read_ses(path) file = File.open(path) fortlog = [] count = fortarea = fortnumber = timedata = guild = 0 line = 0 # 変数の事前宣言(高速化用) while line = file.gets if line =~ /^\n/ then next # 文頭が改行の時、飛ばす # 文頭に「落城回数」がある時は飛ばす elsif line =~ /^落城回数/ then next end # Chung-Rim Guild 1 (0) if line =~ /^\[(\w+\-\w+|\w+) (\w+) (\d)\]/ # 地域名の'-'に対応 fortarea = $1 + " " + $2 fortnumber = $3.to_i # 数字型 next # 砦名の行は飛ばす end # 20:00:00 ギルド名 if line =~ /^(\d\d:\d\d:\d\d)/ timedata = $1 guild = $'.gsub(/^ /, '').chomp # 文頭の空白と最後の改行削除 guild = guild.gsub(MATCH_WORD, REPLASE_WORD) # ギルド名内の置換 end fortlog[count] = [timedata, fortarea, fortnumber, guild] count += 1 end file.close return fortlog.sort # 時系列ソート end # Sara: sara, SaraGvLog, http://imo-gvg.hp.infoseek.co.jp/ # 2005/01/30,20:02:07, GM_,62,砦 [Chung-Rim Guild 1]を [Guild Name] ギルドが占領しました # 2005/01/30,20:02:07,GMM,砦 [Chung-Rim Guild 1]を [Guild Name] ギルドが占領しました def log_read_sara(path) file = File.open(path) fortlog = [] count = fortarea = fortnumber = timedata = guild = 0 line = 0 # 変数の事前宣言(高速化用) while line = file.gets if line =~ /^\n/ then next end # 文頭が改行の時、飛ばす line.chomp! # 改行カット # '#' で以降の文字列をカットされたときの対応 unless line =~ /\] ギルドが占領しました$/ line += "#] ギルドが占領しました" end if line =~ /^(\d+\/\d+\/\d+),(\d+:\d+:\d+),/ timedata = $2 # 時刻 tmp = $' # マッチした部分の次の文字列 if tmp =~ /^ GM_,(\d+),/ # _GM data = $' else data = tmp.gsub(/^GMM,/,'') # GMM end # 地域名の'-'に対応 if data =~ /^砦 \[(\w+|\w+\-\w+) (\w+) (\d)\].+?\[(.+)\]/ fortarea = $1 + " " + $2 fortnumber = $3.to_i # 数字型 # ギルド名が[]の時は""が代入される guild = $4.gsub(MATCH_WORD, REPLASE_WORD) # ギルド名内の置換 else next end fortlog[count] = [timedata, fortarea, fortnumber, guild] count += 1 end end file.close return fortlog.sort # 時系列ソート end # CSV/tab: time, CSV形式のログファイル def log_read_csv(path, delimiter) file = File.open(path) fortlog = [] count = fortname = fortarea = fortnumber = timedata = guild = 0 line = 0 # 変数の事前宣言(高速化用) while line = file.gets if line =~ /^\n/ then next end # 文頭が改行の時、飛ばす # 区切り文字で時間、砦名、ギルドを取り出す (timedata, fortname, guild) = line.chomp.split(delimiter) if fortname =~ /^(\w+|\w+\-\w+) (\w+) (\d)/ # 地域名の'-'に対応 fortarea = $1 + " " + $2 fortnumber = $3.to_i # 数字型 end # split の時、何もない部分は nil になるので空白に置き換える(ソート対策) if guild == nil then guild = "" end guild = guild.gsub(MATCH_WORD, REPLASE_WORD) # ギルド名内の置換 fortlog[count] = [timedata, fortarea, fortnumber, guild] count += 1 end file.close return fortlog.sort # 時系列ソート end # CSV/tab: fortlist, CSV形式の砦別リストファイル def log_read_csv_fortlist(path, delimiter) if FileTest.exist?(path) == false print path, " が存在しません。\n" end file = File.open(path) fortlist = fortlist_init('', 0) fortname = area = number = data = guild = 0 while line = file.gets (fortname, guild, data) = line.chomp.split(delimiter) if fortname =~ /^(\w+|\w+\-\w+) (\w+) (\d)/ # 地域名の'-'に対応 area = getfortcode($1 + " " + $2).to_i number = $3.to_i-1 # 数字型 end # split の時、何もない部分は nil になるので空白に置き換える(ソート対策) if guild == nil then guild = "" end guild = guild.gsub(MATCH_WORD, REPLASE_WORD) # ギルド名内の置換 fortlist[area][number] = [guild, data.to_i] end file.close return fortlist end # CSV/tab: guildlist, hash / array両方対応 def log_read_csv_guildlist(path, delimiter) file = File.open(path) guildlist = {} count = 0 while line = file.gets # 区切り文字でギルド、値を取り出す (guild, data) = line.chomp.split(delimiter) guildlist[guild] = data.to_f end file.close return guildlist end # 時系列: timetable, Lydia GvG log, http://ro.ayatan.org/lydgvg/ # [名前] (占領回数):砦名、ギルド名(以後時間) # 獲得時間 - 占領時間 (防衛時間) ギルド名 # 20:00:00(攻城戦時間開始)〜22:00:00(攻城戦時間終了)2:00:00(堅守) def log_read_timetable(path) file = File.open(path) fortlog = [] count = fortarea = fortnumber = timedata = guild = 0 guild_name_flag = 0 line = 0 # 変数の事前宣言(高速化用) while line = file.gets if line =~ /^\n/ then next # 文頭が改行の時、飛ばす # [砦名]または[ギルド名] (0)の時(堅守)は飛ばす elsif line =~ /^\[ && \] \(0\)$/ then next # 20:00:00 は最初に所持していたギルド名なので飛ばす elsif line =~ /^20:00:00/ then next end # [Chung-Rim Guild 1] (0) if line =~ /^\[/ # 文頭が'['で始まる if line =~ /^\[Valkyrie Realms (\d)\] \(\d+\)/ fortarea = "Valkyrie Realms" fortnumber = $1.to_i # 数字型 guild_name_flag = 1 # []内が砦名のとき next # []のある行を飛ばす elsif line =~ /^\[Chung-Rim Guild (\d)\] \(\d+\)/ fortarea = "Chung-Rim Guild" fortnumber = $1.to_i guild_name_flag = 1 next elsif line =~ /^\[Britoniah Guild (\d)\] \(\d+\)/ fortarea = "Britoniah Guild" fortnumber = $1.to_i guild_name_flag = 1 next elsif line =~ /^\[Luina Guild (\d)\] \(\d+\)/ fortarea = "Luina Guild" fortnumber = $1.to_i guild_name_flag = 1 next else guild_name_flag = 0 # 文頭にある[]内の名前が砦名でないとき next end end if guild_name_flag == 1 # 文頭にある[]内の名前が砦名のとき # 20:00:00 - 22:00:00 (2:00:00) ギルド名 if line =~ /^(\d\d:\d\d:\d\d) - \d\d:\d\d:\d\d \(\d:\d\d:\d\d\)/ timedata = $1 # 時刻 guild = $'.gsub(/^ /, '').chomp # 文頭の空白と最後の改行削除 guild = guild.gsub(MATCH_WORD, REPLASE_WORD) # ギルド名内の置換 fortlog[count] = [timedata, fortarea, fortnumber, guild] end end count += 1 end file.close return fortlog.sort # 時系列ソート end # /savechat Log: savechat # 砦 [Chung-Rim Guild 1]を [Guild Name] ギルドが占領しました def log_read_savechat(path, start_sec, end_sec) file = File.open(path) fortlog = [] count = fortarea = fortnumber = guild = 0 line = 0 # 変数の事前宣言(高速化用) while line = file.gets if line =~ /^\n/ then next end # 文頭が改行の時、飛ばす line = line.gsub(MATCH_WORD, REPLASE_WORD) # 特殊文字列置換 line.chomp! # 改行カット # '#' で以降の文字列をカットされたときの対応 unless line =~ /\] ギルドが占領しました$/ line += "#] ギルドが占領しました" end # 地域名の'-'に対応 if line =~ /^砦 \[(\w+|\w+\-\w+) (\w+) (\d)\].+?\[(.+)\]/ fortarea = $1 + " " + $2 fortnumber = $3.to_i # 数字型 guild = $4 # ギルド名が[]の時は""が代入される else next end fortlog[count] = ['', fortarea, fortnumber, guild] count += 1 end file.close # 時間均等割当 fortlog = generate_time(fortlog, start_sec, end_sec) # 同一時刻で順番が保存されている攻城戦ログを返す。 return fortlog.sort end # 時間の均等な割り当て def generate_time(fortlog, start_sec, end_sec) persec = 0.0 sumsec = start_sec.to_f limit = fortlog.length persec = (end_sec - start_sec).to_f / limit.to_f # 間隔 for count in 0 ... limit fortlog[count][0] = sec2str(sumsec.floor) # 四捨五入して整数に sumsec += persec end return fortlog end # Perl: perl # [Jan 30 20:02:07 2005][S] 砦 [Chung-Rim Guild 1]を [Guild Name] ギルドが占領しました def log_read_perl(path) file = File.open(path) fortlog = [] count = fortarea = fortnumber = time = guild = 0 line = 0 # 変数の事前宣言(高速化用) while line = file.gets if line =~ /^\n/ then next end # 文頭が改行の時、飛ばす line.chomp! # 改行カット # '#' で以降の文字列をカットされたときの対応 unless line =~ /\] ギルドが占領しました$/ line += "#] ギルドが占領しました" end # GM から始まる行だけを対象にする if line =~ /^\[\w\w\w \d\d (\d\d:\d\d:\d\d) \d\d\d\d\]/ time = $1 # 時刻 end line.gsub!(/^\[\w\w\w \d\d (\d\d:\d\d:\d\d) \d\d\d\d\]/, '') # 先頭を削除 line.gsub!(/^\[\w+\]/, '') # [S] などを削除 line.gsub!(/^[\s ]/, '') # 行頭の空白を削除 # 地域名の'-'に対応 if line =~ /^砦 \[(\w+|\w+\-\w+) (\w+) (\d)\].+?\[(.+)\]/ fortarea = $1 + " " + $2 fortnumber = $3.to_i # 数字型 # ギルド名が[]の時は""が代入される guild = $4.gsub(MATCH_WORD, REPLASE_WORD) # ギルド名内の置換 end fortlog[count] = [time, fortarea, fortnumber, guild] count += 1 end file.close return fortlog.sort # 時系列ソート end # HTML攻城戦ログ: ajito, (Freya LogScript Ver.) # Freya LogScriptの WORLDYYYYMMDD_ajito.html ファイル(HTML) # 出力:攻城戦ログ (fortlog) def log_read_ajito(path) file = File.open(path) server = 'freya' # サーバー名 ln = [] fortlog = [] line = "" fortarea = fortnumber = timedata = guild = 0 count = add = 0 # タグの除去と整形 while line = file.gets # HTML/XMLタグをタブに一括変換 line = line.gsub(/<(.+?)>/, "\t").gsub(/\t+/, "\t") # 連続するタブと空白を削除 line = line.gsub(/\t$/, '').gsub(/^\s+/, '') line = line.gsub(/砦別戦績/, '').gsub(/ギルド別戦績/, '') line = line.gsub(/ランキング/, '').gsub(/HOME/, '') line = line.gsub(/最終的な砦主は\[.+/, '').gsub(/陥落時刻/, '') line = line.gsub(/陥落に要した.+/, '').gsub(/総陥落回数.+/, '') line = line.gsub(/奪取したギルド名/, '').gsub(/平均保持時間/, '') line = line.gsub(/^陥落後奪回/, '').gsub(/^完全防衛/, '') line = line.gsub(/^#{server}.+/, '').gsub(/^\t/, '').gsub(/^\n/, '') line = line.gsub(/^陥落回数.+/, '').gsub(/\t(\d\d:\d\d:\d\d)\t/, '') line = line.gsub(/^(\d\d:\d\d:\d\d)\n/, '') # サーバーが強制的に付ける文字列削除(ジオシティなら 'geovisit();' line = line.gsub(/geovisit\(\)\;\n/, '') if line == "" then next end # 内容がなければ飛ばす if line == nil then next end # 内容がなければ飛ばす ln[count] = line count += 1 end file.close limit = ln.length for count in 0 ... limit # 攻城戦ログ配列作成 line = ln[count] line = line.gsub(MATCH_WORD, REPLASE_WORD) # 特殊文字列置換 if line == '' then next end # 空白なら次へ if line =~ /^\n/ then next end # 文頭に改行なら次へ if line =~ /^#{GVG_TIME['START'][0]}/ then next end # 開始時間なら飛ばす if line =~ /^(\w+\-\w+|\w+) (\w+) (\d)/ # 地域名の'-'に対応 fortarea = $1 + " " + $2 # Chung-Rim Guild 1 fortnumber = $3.to_i # 数字型 next # 砦名の行は飛ばす end if line =~ /^(\d\d:\d\d:\d\d)/ # 20:00:00 ギルド名 timedata = $1 # 時刻 guild = $'.gsub(/^ /, '').chomp # 文頭の空白と最後の改行削除 end fortlog[add] = [timedata, fortarea, fortnumber, guild] add += 1 end return fortlog.sort # 時系列ソート end # 砦別リスト: fortlist, その他 # その他があった場合はタブで区切る def log_read_fortlist(path) fortlist = fortlist_init('', 0) file = File.open(path) fortcode = fortnumber = 0 guild = others = "" while line = file.gets if line =~ /^day/ then next end # 日付の行は飛ばす line = line.gsub(MATCH_WORD, REPLASE_WORD) # 特殊文字列置換 if line =~ /^(V|C|B|L)(\d)=/ fortcode = getfortcode($1) # 数字型 fortnumber = $2.to_i # 文字列型 -> 数字型へ guild = $'.gsub(/^ /, '').chomp # 文頭の空白と最後の改行削除 if guild =~ /\t/ # ギルド名の後にタブでその他がある時 guild = $` others = $' end fortlist[fortcode][fortnumber-1] = [guild, others] # ギルド、その他 end end file.close return fortlist end # 砦別リスト: fortlist, RO攻城戦ログ集計形式 # 砦リスト、防衛時間の読み込み def log_read_fortlist_logscript(path, delimiter) fortlist = fortlist_init('', 0) file = File.open(path) fortcode = fortnumber = 0 while line = file.gets if line =~ /^#/ then next end # 先頭に'#'が来る行は飛ばす line = line.gsub(MATCH_WORD, REPLASE_WORD) # 特殊文字列置換 if line =~ /^(\w+\-\w+|\w+) (\w+) (\d)\t/ fortcode = getfortcode($1 + " " + $2) fortnumber = $3.to_i # 数字型 guild = $'.chomp # gsub(/^ /, '').chomp # 文頭の空白と最後の改行削除 # <>の後に続く防衛時間を削除する (guild, time) = guild.split(/delimiter/) # "<>", ",", "\t" fortlist[fortcode][fortnumber-1] = [guild, time] # ギルド、防衛時間 end end file.close return fortlist end # 砦別リスト: fortlist, 攻城速報@ろらじお形式 def log_read_fortlist_gvgf(path) fortlist = fortlist_init('', 0) file = File.open(path) fortcode = fortnumber = 0 guild = "" while line = file.gets line = line.gsub(MATCH_WORD, REPLASE_WORD) # 特殊文字列置換 if line =~ /^day/ then next end # 日付の行は飛ばす if line =~ /^(V|C|B|L)(\d)=/ fortcode = getfortcode($1) # 数字型 fortnumber = $2.to_i # 文字列型 -> 数字型へ guild = $'.gsub(/^ /, '').chomp # 文頭の空白と最後の改行削除 fortlist[fortcode][fortnumber-1] = [guild, ''] # ギルド、空文字列 end end file.close return fortlist end ##### Fortlog Line 攻城戦ログ配列 # timetable形式作成 # 出力: fort_array, guild_array def log_make_timetable(bef_fortlist, now_fortlist, fortlog) fort_array = breaklist_fort_make(bef_fortlist, now_fortlist, fortlog) guild_array = breaklist_guild_make(bef_fortlist, now_fortlist, fortlog) return fort_array, guild_array end # 砦別リスト作成 - timetable # breakfort: ハッシュ、配列両方対応 def log_line_fort(breakfort) line = [] count = 0 key = value = difftime = "" breakfort.each { |key, value| limit = value.length line[count+=1] = "[" + key + "] (" + (limit-2).to_s + ")\n" for row in 0 ... limit-1 difftime = time_diff(value[row+1][0], value[row][0]) line[count+=1] = value[row][0] + " - " + value[row+1][0] line[count] += " (" + difftime + ") " + value[row][1] + "\n" end line[count+=1] = "\n" } return line end # ギルド別リスト保存 - timetable # breakguild: ハッシュ、配列両方対応 def log_line_guild(breakguild) line = [] count = 0 key = value = difftime = "" breakguild.each { |key, value| limit = value.length limit_break = limit = value.length if value == nil then next end # 配列がない場合は飛ばす for row in 0 ... limit # 最初の砦所持はブレイク数から除外 if value[row][0] == "20:00:00" limit_break -= 1 end end line[count+=1] = "[" + key + "] (" + limit_break.to_s + ")\n" for row in 0 ... limit difftime = time_diff(value[row][1], value[row][0]) line[count+=1] = value[row][0] + " - " + value[row][1] line[count] += " (" + difftime + ") " + value[row][2] + "\n" end line[count+=1] = "\n" } return line end # 破壊点数ランキング (SERA) def log_line_guildlist(breakguild) line = [] count = rank = now_rank = now_point = before_point = 0 guild = "" guild_rank = breakguild.sort{|x, y| y[1] <=> x[1]} guild_rank.each { |guild| rank += 1 now_point = sprintf("%.1f", guild[1]).to_f unless before_point == now_point now_rank = rank end line[count+=1] = sprintf("%3d位", now_rank) + sprintf("%6.1f点", guild[1]) line[count] += " " + guild[0] + "\n" before_point = now_point } return line end # time(tab/csv)形式読込 # CSV形式でログファイルに保存 def log_line_csv(fortlog, delimiter) line = [] limit = fortlog.length # 占領総回数(ログの長さ) for count in 0 ... limit line[count] = fortlog[count][0] + delimiter # 時間 line[count] += fortlog[count][1] + " " # 砦地域 line[count] += fortlog[count][2].to_s + delimiter # 砦番号 line[count] += fortlog[count][3] + "\n" # ギルド名 end return line end # 時系列: timetable, Lydia GvG log, http://ro.ayatan.org/lydgvg/ # [名前] (占領回数):砦名、ギルド名(以後時間) # 獲得時間 - 占領時間 (防衛時間) ギルド名 # 20:00:00(攻城戦時間開始)〜22:00:00(攻城戦時間終了)2:00:00(堅守) def log_line_timetable(breakfort, breakguild) return (log_line_fort(breakfort) + log_line_guild(breakguild)) end # 砦別リスト文字列配列作成 # fortlist[砦地域][砦番号] = nil の場合は空白 def log_line_fortlist(fortlist) line = [] count = 0 for area in 0 ... ROW for number in 0 ... COLUMN line[count] = getfortarea(area, 0) + (number+1).to_s + "=" if fortlist[area][number] == nil # 空白の時 line[count] += "\n" next # 次に飛ばす end line[count] += fortlist[area][number][0] + "\t" line[count] += fortlist[area][number][1] + "\n" count += 1 end end return line end # 砦主リスト作成(RO攻城戦ログ集計スクリプト形式) # 砦主リストからRO攻城戦ログ集計スクリプト形式の最初の砦主リストを作成する def log_line_fortlist_logscript(fortlist, ymd) line = [] fortname = fortarea = "" fortnumber = count = 0 for area in 0 ... ROW for number in 0 ... COLUMN if area == 0 then fortcode = 2 # V -> B 砦順番の変更 elsif area == 1 then fortcode = 1 # C -> C elsif area == 2 then fortcode = 3 # B -> L elsif area == 3 then fortcode = 0 end # L -> V fortarea = getfortarea(fortcode, 2) fortnumber = (number + 1).to_s fortname = fortarea + " " + fortnumber # 砦名 line[count] = ymd + " 20:00:00\t" + fortname + "\t" + fortlist[fortcode][number][0] count += 1 end end return line end # 攻城戦ログ作成(RO攻城戦ログ集計スクリプト用) # 攻城戦ログからRO攻城戦ログ集計スクリプト用攻城戦ログを作成する def log_line_fortlog_logscript(fortlog, ymd) line = [] limit = fortlog.length # 占領総回数(ログの長さ) fortname = fortarea = "" fortnumber = 0 for count in 0 ... limit fortarea = fortlog[count][1] fortnumber = fortlog[count][2].to_s fortname = fortarea + " " + fortnumber line[count] = ymd + " " + fortlog[count][0] + "\t" + fortname line[count] += "\t" + fortlog[count][3] end return line end ##### FortLog Write: 攻城戦ログ書込 # 形式自動判別 - ログファイル名からログフォーマットを自動判別します。 def log_write_format(path, bef_fortlist, fortlog) filename = File.basename(path) # ファイル名の取得 if filename =~ /^ropp_/ then return log_write_ropp(path, fortlog) elsif filename =~ /^rofx_/ then return log_write_rofx(path) elsif filename =~ /^lydia_/ then return log_write_lydia(path, fortlog) elsif filename =~ /^ses_/ then return log_write_ses(path, bef_fortlist, fortlog) elsif filename =~ /^sara_/ then return log_write_sara(path) elsif filename =~ /^chatpon_/ then return log_write_chatpon(path, fortlog) elsif filename =~ /^bracket_/ then return log_write_bracket(path, fortlog) elsif filename =~ /^timetab_/ then return log_write_csv(path, "\t") elsif filename =~ /^timecsv_/ then return log_write_csv(path, ",") elsif filename =~ /^time_/ # タブは""で囲まないといけない if filename =~ /.txt$/ then return log_write_csv(path, fortlog, "\t") elsif filename =~ /.csv$/ then return log_write_csv(path, fortlog, ",") end elsif filename =~ /^timetable_/ # 時系列表作成 now_fortlist = fortlist_make(bef_fortlist, fortlog) (breakfort, breakguild) = log_make_timetable(bef_fortlist, now_fortlist, fortlog) return log_write_timetable(path, breakfort, breakguild) # elsif filename =~ /^savechat_/ then return log_write_savechat(path, "20:01", "22:00") # elsif filename =~ /^pertime_/ then return log_write_pertime(path) elsif filename =~ /^perl_/ then return log_write_perl(path) else print < [Chung-Rim Guild 1] [Guild Name] ギルドが占領しました # [GVG] <20:02:07> [Chung-Rim Guild 1] [Guild Name] ギルドが占領しました # ※[状態] と <時刻>の間に "\t"(タブ)が入ります。 def log_write_chatpon(path, fortlog) file = File.open(path, "w") limit = fortlog.length # 占領総回数(ログの長さ) for count in 0 ... limit file.print "[GVG]\t<", fortlog[count][0], "> 砦 [" file.print fortlog[count][1], " " file.print fortlog[count][2], "]を [" file.print fortlog[count][3], "] ギルドが占領しました\n" end file.close end # RoFX: rofx, RoFX, http://roxxx.s151.xrea.com/ # [20:02:07][GMM] 砦 [Chung-Rim Guild 1]を [Guild Name] ギルドが占領しました def log_write_rofx(path) file = File.open(path, "w") limit = fortlog.length # 占領総回数(ログの長さ) for count in 0 ... limit file.print "[", fortlog[count][0], "][GMM] 砦 [" file.print fortlog[count][1], " " file.print fortlog[count][2], "]を [" file.print fortlog[count][3], "] ギルドが占領しました\n" end file.close end # ブラケット: bracket, データが "[" と "]" で区切られる形式 # [Jan 30 20:02:07 2005][Chung-Rim Guild 1][Guild Name] def log_write_bracket(path, fortlog) log_date = Date.parse(path) mon = Date::MONTHNAMES[log_date.month].slice(0..2) # 月を英語名にする file = File.open(path, "w") limit = fortlog.length # 占領総回数(ログの長さ) for count in 0 ... limit file.print "[", mon, " ", log_date.day, " " file.print fortlog[count][0], " ", log_date.year, "][" file.print fortlog[count][1], " " file.print fortlog[count][2], "][" file.print fortlog[count][3], "]\n" end file.close end # Lydia: lydia, Lydia GvG log, http://ro.ayatan.org/lydgvg/ # 砦名 (占領回数) # 時間 ギルド名 def log_write_lydia(path, fortlog) file = File.open(path, "w") timelist = [] # [時間, ギルド名] limit = fortlog.length # 占領総回数(ログの長さ) for area in 0 ... ROW for number in 0 ... COLUMN count_break = 0 # 占領回数 for count_fort in 0 ... limit fortcode = getfortcode(fortlog[count_fort][1]) fortnumber = fortlog[count_fort][2].to_i # fortlogの砦名が一致するかどうか if (area == fortcode) && ((number+1) == fortnumber) # 時系列[占領No.] = [[時間] [ギルド名]] の行を作る timelist[count_break] = fortlog[count_fort][0] + " " + fortlog[count_fort][3] count_break += 1 end end # 砦名(占領回数): "Valkyrie Realms 1 (25)" fortarea = getfortarea(area, 2) file.print fortarea, " ", (number+1), " (", count_break, ")\n" # 砦別ログリストの出力: "時間 ギルド名" for count in 0 ... count_break file.print timelist[count], "\n" end file.print "\n" end end file.close end # Ses板: ses, Ses板の攻城戦スレに投稿されるログ形式 # [砦名] (元・開始前占領ギルド) # 時間 ギルド名 # 占領回数: 回 def log_write_ses(path, bef_fortlist, fortlog) file = File.open(path, "w") timelist = [] # [時間, ギルド名] limit = fortlog.length # 占領総回数(ログの長さ) for area in 0 ... ROW for number in 0 ... COLUMN count_break = 0 # 占領回数 # 砦名(占領回数): "Valkyrie Realms 1 (25)" fortarea = getfortarea(area, 2) file.print "[", fortarea, " ", (number+1), "] (元・" file.print bef_fortlist[area][number][0], ")\n" for count_fort in 0 ... limit fortcode = getfortcode(fortlog[count_fort][1]) fortnumber = fortlog[count_fort][2].to_i # fortlogの砦名が一致するかどうか if (area == fortcode) && ((number+1) == fortnumber) # 砦別ログリストの出力: "時間 ギルド名" file.print fortlog[count_fort][0] + " " + fortlog[count_fort][3],"\n" count_break += 1 end end file.print "落城回数: ", count_break, "回\n\n" end end file.close end # Sara: sara, SaraGvLog, http://imo-gvg.hp.infoseek.co.jp/ # 2005/01/30,20:02:07, GM_,62,砦 [Chung-Rim Guild 1]を [Guild Name] ギルドが占領しました # 2005/01/30,20:02:07,GMM,砦 [Chung-Rim Guild 1]を [Guild Name] ギルドが占領しました def log_write_sara(path, fortlog) log_date = Date.parse(path) file = File.open(path, "w") limit = fortlog.length # 占領総回数(ログの長さ) for count in 0 ... limit file.print log_date.ymd_slash, ",", fortlog[count][0], "," # file.print " GM_,62" file.print "GMM" file.print ",砦 [" file.print fortlog[count][1], " " file.print fortlog[count][2], "]を [" file.print fortlog[count][3], "] ギルドが占領しました\n" end file.close end # CSV/tab: time, CSV形式のログファイル def log_write_csv(path, fortlog, delimiter) file = File.open(path, "w") limit = fortlog.length # 占領総回数(ログの長さ) for count in 0 ... limit file.print fortlog[count][0], delimiter # 時間 file.print fortlog[count][1], " " # 砦地域 file.print fortlog[count][2], delimiter # 砦番号 file.print fortlog[count][3], "\n" # ギルド名 end file.close end # CSV/tab: fortlist, CSV形式の砦別リストファイル def log_write_csv_fortlist(path, fortlist, delimiter) file = File.open(path, "w") area = number = 0 for area in 0 ... ROW for number in 0 ... COLUMN fortarea = getfortarea(area, 2) # 砦地域(正式名) file.print fortarea, " ", (number+1).to_s, delimiter file.print fortlist[area][number][0], delimiter # ギルド名 file.print fortlist[area][number][1], "\n" # データ end end file.close end # CSV/tab: guildlist, hash / array両方対応 def log_write_csv_guildlist(path, guildlist, delimiter) file = File.open(path, "w") count = 0 guild_rank = guildlist.sort{|x, y| y[1] <=> x[1]} guild_rank.each { |key, value| file.print key, delimiter, value, "\n" count += 1 } file.close end # CSV/tab: guildlist, 集計全体表(tab/csv)形式保存 def log_write_csv_guildlist_ranking(path, guildlist, delimiter) file = File.open(path, "w") rank = now_rank = before_rank = now_point = before_point = 0 # イテレータ変数の事前宣言(高速化用) guild = "" # file.print "順位,回数,ギルド名\n" guild_rank = guildlist.sort{|x, y| y[1] <=> x[1]} guild_rank.each { |guild| rank += 1 now_point = guild[1] unless before_point == now_point now_rank = rank end file.print now_rank.to_s, delimiter, guild[1], delimiter # sprintf("%d", guild[1]), delimiter file.print guild[0], "\n" before_rank = now_rank # 今の順位を記憶 before_point = now_point # 今の点数を記憶 } file.close end # 時系列: timetable, Lydia GvG log, http://ro.ayatan.org/lydgvg/ # [名前] (占領回数):砦名、ギルド名(以後時間) # 獲得時間 - 占領時間 (防衛時間) ギルド名 # 20:00:00(攻城戦時間開始)〜22:00:00(攻城戦時間終了)2:00:00(堅守) def log_write_timetable(path, breakfort, breakguild) file = File.open(path, "w") file.print log_line_fort(breakfort) file.print log_line_guild(breakguild) file.close end # Perl: perl # [Jan 30 20:02:07 2005][S] 砦 [Chung-Rim Guild 1]を [Guild Name] ギルドが占領しました def log_write_perl(path) log_date = Date.parse(path) mon = Date::MONTHNAMES[log_date.month].slice(0..2) # 月を英語名にする file = File.open(path, "w") limit = fortlog.length # 占領総回数(ログの長さ) for count in 0 ... limit file.print "[", mon, " ", log_date.day, " " file.print fortlog[count][0], " ", log_date.year, "][S][" file.print fortlog[count][2], "]を [" file.print fortlog[count][3], "] ギルドが占領しました\n" end file.close end # 砦別リスト: fortlist, その他 # その他があった場合はタブで区切る def log_write_fortlist(path, fortlist, ymd) file = File.open(path, "w") # ファイルの最初に日付を記入 file.print "day=", ymd, "\n" # ymd = '%Y_%m_%d' for area in 0 ... ROW for number in 0 ... COLUMN file.print getfortarea(area, 0), number+1, "=" if fortlist[area][number] == nil # 空白の時 file.print "\n" next # 次に飛ばす end file.print fortlist[area][number][0] # その他があれば書き込む if fortlist[area][number][1] == "" file.print "\n" else file.print "\t", fortlist[area][number][1], "\n" end end end file.close end # 砦別リスト: fortlist, 攻城速報@ろらじお形式 def log_write_fortlist_gvgf(fortlist, path, ymd) file = File.open(path, "w") # ファイルの最初に日付を記入 file.print "day=", ymd, "\n" # ymd = '%Y_%m_%d' for area in 0 ... ROW for number in 0 ... COLUMN file.print getfortarea(area, 0), number+1, "=" file.print fortlist[area][number][0], "\n" end end file.close end # ギルドリスト: guildlist, hash / array両方対応 def log_write_guildlist(path, fortlog) file = File.open(path, "w") # 占領ギルド名の重複を削除してソートする。 guildlist = fortlog.collect{|x| x[3]}.uniq.sort # 占領ギルド名リスト limit = guildlist.length for count in 0 ... limit file.print guildlist[count], "\n" end file.close end # 砦別リスト出力(その他) # その他があった場合はタブで区切って出力する。 def log_print_fortlist(fortlist, ymd) # ファイルの最初に日付を記入 print "day=", ymd, "\n" # ymd = '%Y_%m_%d' for area in 0 ... ROW for number in 0 ... COLUMN print getfortarea(area, 0), number+1, "=" print fortlist[area][number][0], " " if fortlist[area][number][1] == "" print "\n" else print "\t", fortlist[area][number][1], "\n" end end end end # 砦別リスト出力(攻城速報@ろらじお形式) def log_print_fortlist_gvgf(fortlist, ymd) # ファイルの最初に日付を記入 print "day=", ymd, "\n" # ymd = '%Y_%m_%d' for area in 0 ... ROW for number in 0 ... COLUMN print getfortarea(area, 0), number+1, "=" print fortlist[area][number][0], "\n" end end end # 砦別取得履歴の出力 def log_history_fort(history, use_datelist, area) limit_week = use_datelist.length line = [] count_week = number = count = count_bin = 0 line[count+=1] = "◎" + getfortarea(area, 2).to_s + "\n" line[count+=1] = "Date / No. " for number in 0 ... COLUMN line[count+=1] = "\t" + (number+1).to_s # FORT_NAME[LANG][area][number] end line[count+=1] = "\n" for count_week in 0 ... limit_week use_date = Date.parse(use_datelist[count_week][0]) # 日付オブジェクト slash_ymd = use_date.ymd_slash line[count+=1] = slash_ymd if use_datelist[count_week][1] == 1 # 攻城戦中止 line[count+=1] = "\t攻城戦中止" else for number in 0 ... COLUMN unless history[count_week] == nil if history[count_week][area][number][1] != 0 line[count+=1] = "\t" + history[count_week][area][number][0] line[count+=1] = "(" + history[count_week][area][number][1].to_s + ")" else line[count+=1] = "\t" + history[count_week][area][number][0] end end end end line[count+=1] = "\n" end line[count+=1] = "\n" return line end