=begin =ギルド別リスト作成 ==前提条件 時系列に沿った攻城戦ログ 攻城戦ログの先頭順に占領砦が格納される。 従って、攻城戦ログが時系列に沿っている必要がある。 =end def guildlist_make(guildarray, fortlist, fortlog) guildlist = {} key = value = "" count = 0 # 占領ログからギルド別占領回数リスト(ハッシュ)を作る guildlist_breakcount = guildlist_fortlog_breakcount(guildlist, fortlog) # 占領ログからギルド別取得砦リスト(ハッシュ)を作る guildlist_getfort = guildlist_fortlist_getfort(fortlist) # 占領ログからギルド別占領砦リスト(ハッシュ)を作る guildlist_announce = guildlist_fortlog_announce(fortlog, ", ") # ハッシュからギルド名と占領砦リストを配列に guildlist_breakcount.each { |key, value| guildarray[count][0] = key # ギルド名 guildarray[count][1] = guildlist_breakcount[key] # 占領回数 if guildlist_getfort[key] != nil # 獲得砦があれば代入する guildarray[count][3] = guildlist_getfort[key] # 獲得砦 end guildarray[count][4] = guildlist_announce[key] # 占領履歴 count += 1 } return guildarray end =begin == ギルド別ランキング作成 == 前提条件 順位、取得砦の有無でソート済みのギルドリスト配列 同じ占領回数なら順位を同じにする。 また取得砦ありギルド同士の順位も別にして、同じにする。 =end def guildlist_ranking(guildarray) limit = guildarray.length # ギルド総数 for count in 0 ... limit # 一つ前と今のギルドが同じ占領数の場合 if guildarray[count-1][1] == guildarray[count][1] # 一つ前のギルドが最終的に砦を取ってない場合 if guildarray[count-1][3] == "" # 獲得砦なしの場合 guildarray[count][2] = guildarray[count-1][2] # 一つ前のギルドが最終的に砦を取った場合 else # 今のギルドも砦取った場合、順位を同じにする if guildarray[count][3] != "" # 獲得砦がある場合 # 一つ前と今のギルドの砦獲得個数が同じ場合 if guildarray[count-1][3].length == guildarray[count][3].length guildarray[count][2] = guildarray[count-1][2] # 一つ前と今のギルドの砦獲得個数が違う場合 else guildarray[count][2] = count + 1 end # 今のギルドが砦取ってない場合、順位を変える else guildarray[count][2] = count + 1 end end # 一つ前と今のギルドが異なる占領数の場合 else guildarray[count][2] = count + 1 end end return guildarray end =begin = guildlist fortlog, fortlist =end =begin == ギルド別占領総数 =end def guildlist_fortlog_breakcount(guildlist, fortlog) limit = fortlog.length guild = "" for count in 0 ... limit guildlist.add!(fortlog[count][3], 1) end return guildlist end =begin == ギルド別砦地域占領回数 =end def guildlist_fortlog_breakarea(guildlist, fortlog) limit = fortlog.length guild = fortarea = "" for count in 0 ... limit guild = fortlog[count][3] fortarea = getfortcode(fortlog[count][1]) if guildlist[guild] == nil guildlist[guild] = [] for area in 0 ... ROW guildlist[guild][area] = 0 # 初期化 end end guildlist[guild][fortarea] += 1 end return guildlist end =begin == ギルド別砦番号占領回数 =end def guildlist_fortlog_breaknumber(guildlist, fortlog) limit = fortlog.length guild = fortnumber = "" for count in 0 ... limit guild = fortlog[count][3] fortnumber = fortlog[count][2] if guildlist[guild] == nil guildlist[guild] = [] for number in 0 ... COLUMN guildlist[guild][number] = 0 # 初期化 end end guildlist[guild][fortnumber-1] += 1 end return guildlist end =begin == 占領履歴ギルドリスト =end def guildlist_fortlog_announce(fortlog, delimiter) limit = fortlog.length # 占領総回数(ログの長さ) guildlist = {} guild = fortname = "" area = 0 for count in 0 ... limit guild = fortlog[count][3] area = getfortcode(fortlog[count][1]) fortname = getfortarea(area, 0) + fortlog[count][2].to_s guildlist.add!(guild, delimiter+fortname, fortname) end return guildlist end =begin == 砦確保ギルド総数 =end def guildlist_fortlist_breakcount(guildlist, fortlist) for area in 0 ... ROW for number in 0 ... COLUMN guildlist.add!(fortlist[area][number][0], 1) end end return guildlist end =begin == 砦確保ギルド地域別回数 =end def guildlist_fortlist_breakarea(guildlist, fortlist) guild = "" for area in 0 ... ROW for number in 0 ... COLUMN guild = fortlist[area][number][0] # ギルド名 if guildlist[guild] == nil guildlist[guild] = [] for fortarea in 0 ... ROW guildlist[guild][fortarea] = 0 # 初期化 end end guildlist[guild][area] += 1 end end return guildlist end =begin == 砦確保ギルド砦番号別回数 =end def guildlist_fortlist_breaknumber(guildlist, fortlist) guild = "" for area in 0 ... ROW for number in 0 ... COLUMN guild = fortlist[area][number][0] # ギルド名 if guildlist[guild] == nil guildlist[guild] = [] for fortnumber in 0 ... COLUMN guildlist[guild][fortnumber] = 0 # 初期化 end end guildlist[guild][number] += 1 end end return guildlist end =begin == 砦確保ギルド別総防衛時間 =end def guildlist_fortlist_defense(guildlist, fortlist) guild = "" total_defense = defense = 0 for area in 0 ... ROW for number in 0 ... COLUMN guild = fortlist[area][number][0] # ギルド名 if guild == "" # "": ギルド名が得られない(空白)時 print "guildlist_fortlist_defense Error: " print getfortarea(area, 0), number+1, "\n" next end defense = str2sec(fortlist[area][number][1]) if guildlist[guild] == nil # 新ギルドの場合 guildlist[guild] = sec2str(defense) else # 防衛時間を加算 total_defense = str2sec(guildlist[guild]) guildlist[guild] = sec2str(total_defense + defense) end end end return guildlist end =begin == 砦確保ギルド別の内容加算(ギルドハッシュ) =end def guildlist_fortlist_add(guildlist, fortlist) guild = "" for area in 0 ... ROW for number in 0 ... COLUMN guildlist.add!(fortlist[area][number][0], fortlist[area][number][1]) end end return guildlist end =begin == 砦確保ギルド別取得砦名 =end def guildlist_fortlist_getfort(fortlist) guildlist = {} fortname = "" for area in 0 ... ROW for number in 0 ... COLUMN # fortlist[砦地域][砦番号] == nil なら省略 if fortlist[area][number] != nil guild = fortlist[area][number][0] # ギルド名 fortname = "※" + getfortarea(area, 0) + (number+1).to_s guildlist.add!(guild, ", "+fortname, fortname) end end end return guildlist end =begin == 最大のギルド名 ギルドハッシュの最大要素を持つギルドを最大ギルドとして返します。 最大が複数あるときはまとめます。 =end def guildlist_max(guildlist) key = value = "" line = [] top = count = 0 top = guildlist.values.max # ハッシュの全値から最大占領数を求める # 最大占領数のギルドを文字列にする guildlist.each { |key, value| if value == top line[count] = "「" + key + "」" count += 1 end } line = line.sort return line end =begin == ギルドリスト加算 =end def guildlist_add(guildlist, guildlist_add) guildlist_add.each { |key, value| guildlist.add!(key, value) # ハッシュの同じキーの要素を加算する } return guildlist end =begin == ギルドリスト出力 =end def guildlist_print(guildlist) count = 0 print "順位 ギルド名\t値\n" guildlist.each { |key, value| print count+1, "位 ", key, "\t", value, "\n" count += 1 } end =begin = breaklist =end =begin == 砦別占領ギルド(攻城戦開始前) === 入力 砦別リスト 開始時間(20:00:00) === 出力 砦別占領リスト =end def breaklist_fort_start(fortlist, starttime) breaklist = {} fortname = startguild = "" for area in 0 ... ROW for number in 0 ... COLUMN fortname = getfortarea(area, 2) + " " + (number+1).to_s startguild = fortlist[area][number][0] breaklist[fortname] = [] # ハッシュ配列の宣言 breaklist[fortname][0] = [starttime, startguild] end end return breaklist end =begin == 砦別占領砦(攻城戦時間中) === 入力 攻城戦ログ 砦別占領リスト === 出力 砦別占領リスト =end def breaklist_fort_now(breaklist, fortlog) limit = fortlog.length # 占領総回数(ログの長さ) fortname = "" fortline = 0 for count in 0 ... limit fortname = fortlog[count][1] + " " + fortlog[count][2].to_s if breaklist[fortname] == nil # 新砦なら、配列を用意 breaklist[fortname] = [] # ハッシュ配列の宣言 end fortline = breaklist[fortname].length # 最終占領回数 # [砦名][番号] = [時間, ギルド名] breaklist[fortname][fortline] = [fortlog[count][0], fortlog[count][3]] end return breaklist end =begin == 砦別占領ギルド(攻城戦終了後) === 入力 砦別リスト 砦別占領リスト 現在時間(終了時間:22:00:00) === 出力 砦別占領リスト =end def breaklist_fort_end(breaklist, fortlist, nowtime) fortname = lasttime = endtime = "" fortline = 0 nowsec = str2sec(nowtime) # 現在時間を秒に。22時:79200秒 for area in 0 ... ROW for number in 0 ... COLUMN fortname = getfortarea(area, 2) + " " + (number+1).to_s if breaklist[fortname] == nil # 新砦なら、配列を用意 breaklist[fortname] = [] # ハッシュ配列の宣言 else fortline = breaklist[fortname].length # 最終占領回数 lasttime = breaklist[fortname][fortline-1][0] if str2sec(lasttime) > nowsec # 最終時間が現在時間を過ぎている時 endtime = lasttime # 最終時間を終了時間にする else endtime = nowtime # 現在時間を終了時間にする end # [砦名][番号] = [時間, ギルド名] breaklist[fortname][fortline] = [endtime, fortlist[area][number][0]] end end end return breaklist end =begin == 砦別占領リスト作成 timetable形式用 =end def breaklist_fort_make(bef_fortlist, now_fortlist, fortlog) key = value = "" # イテレータ変数の事前宣言(高速化用) fort_array = [] fort_sort = [] x = y = 0 count = 0 # 砦別リスト作成 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]) # 砦地域順番作成 for area in 0 ... ROW for number in 0 ... COLUMN fort_sort[count] = getfortarea(area, 2) + " " + (number+1).to_s count += 1 end end # 砦別ハッシュを配列に。砦地域を'V,C,B,L'の順に並べる breaklist_array = breaklist.sort do |x, y| fort_sort.index(x[0]) <=> fort_sort.index(y[0]) end return breaklist_array end =begin == ギルド別占領砦(攻城戦開始前) === 入力 砦別リスト 攻城戦ログ 開始時間(20:00:00) 現在時間(終了時間:22:00:00) === 出力 ギルド別占領リスト =end def breaklist_guild_start(fortlist, fortlog, starttime, nowtime) limit = fortlog.length # 占領総回数(ログの長さ) breaklist = {} fortname = fortline = nexttime = guild = nextguild = "" for area in 0 ... ROW # 初期設定 for number in 0 ... COLUMN fortarea = getfortarea(area, 2) fortname = fortarea + " " + (number+1).to_s guild = fortlist[area][number][0] if breaklist[guild] == nil breaklist[guild] = [] # ハッシュ配列の宣言 end fortline = breaklist[guild].length # 同じギルドが他の砦を所有している場合 breaklist[guild][fortline] = [starttime, nowtime, fortname, guild, guild] for count_break in 0 ... limit # 砦番号を先に検索する。(処理速度向上のため) if (number+1) == fortlog[count_break][2] # 砦番号 if fortarea == fortlog[count_break][1] # 砦地域 nexttime = fortlog[count_break][0] # 落城した時間 nextguild = fortlog[count_break][3] # 落城時に占領したギルド breaklist[guild][fortline] = [starttime, nexttime, fortname, guild, nextguild] break # 見つけたら検索終了 end end end end end return breaklist end =begin == ギルド別占領砦(攻城戦時間中) === 入力 攻城戦ログ ギルド別占領リスト === 出力 ギルド別占領リスト =end def breaklist_guild_now(breaklist, fortlist, fortlog) limit = fortlog.length # 占領総回数(ログの長さ) fortname = fortarea = guild = nexttime = "" fortline = fortnumber = 0 for count in 0 ... limit fortarea = fortlog[count][1] fortnumber = fortlog[count][2] fortname = fortarea + " " + fortnumber.to_s guild = fortlog[count][3] nexttime = GVG_TIME['END'][0] # 最後まで落城しない時(初期化) befguild = nextguild = "" # 初期化 if breaklist[guild] == nil # 新ギルドなら、配列を用意 breaklist[guild] = [] # ハッシュ配列の宣言 end fortline = breaklist[guild].length # 最終占領回数 # 次の落城検索 count_end = count + 1 # 現在処理している行の次にセット for count_break in count_end ... limit # 砦番号を先に検索する。(処理速度向上のため) if fortnumber == fortlog[count_break][2] # 砦番号 if fortarea == fortlog[count_break][1] # 砦地域 nexttime = fortlog[count_break][0] # 落城した時間 nextguild = fortlog[count_break][3] # 落城時に占領したギルド break # 見つけたら検索終了 end end end # 直前の落城検索 count_break = count - 1 # 現在処理している行の直前にセット while count_break > 0 # 処理済の行から逆順で占領したギルドを探す # 砦番号を先に検索する。(処理速度向上のため) if fortnumber == fortlog[count_break][2] # 砦番号 if fortarea == fortlog[count_break][1] # 砦地域 befguild = fortlog[count_break][3] # 占領したギルド break # 見つけたら検索終了 end end count_break -= 1 end if befguild == "" # fortlog の中にないとき area = getfortcode(fortarea) number = fortnumber - 1 befguild = fortlist[area][number][0] # 前回の砦所有リスト end # 次の配列に新たな内容を入れる breaklist[guild][fortline] = [fortlog[count][0], nexttime, fortname, befguild, nextguild] end return breaklist end =begin == ギルド別占領砦(攻城戦終了後) === 入力 砦別リスト ギルド別占領リスト 現在時間(終了時間:22:00:00) === 出力 ギルド別占領リスト =end def breaklist_guild_end(breaklist, fortlist, nowtime) fortname = guild = endtime = lasttime = lastname = "" fortline = 0 nowsec = str2sec(nowtime) # 現在時間を秒に。22時:79200秒 for area in 0 ... ROW for number in 0 ... COLUMN fortname = getfortarea(area, 2) + " " + (number+1).to_s guild = fortlist[area][number][0] if breaklist[guild] == nil # 新ギルドなら、配列を用意 breaklist[guild] = [] # ハッシュ配列の宣言 else fortline = breaklist[guild].length # 最終占領回数 if fortline > 0 # 配列に時間が入っているならば # 最初または他に砦を持っていてそのまま堅守かつ、他に占領した時 if fortname == breaklist[guild][fortline-1][2] lasttime = breaklist[guild][fortline-1][0] # 最終占領時間 lastname = breaklist[guild][fortline-1][3] # 最終占領直前のギルド if str2sec(lasttime) > nowsec # 最終時間が現在時間を過ぎている時 endtime = lasttime # 最終時間を終了時間にする else endtime = nowtime # 現在時間を終了時間にする end # 今の配列の内容を書き換える breaklist[guild][fortline-1] = [lasttime, endtime, fortname, lastname, guild] end end end end end return breaklist end =begin == ギルド別占領リスト作成 timetable形式用 =end def breaklist_guild_make(bef_fortlist, now_fortlist, fortlog) guild_array = [] x = y = 0 # ギルド別リスト作成 guildlist = breaklist_guild_start(bef_fortlist, fortlog, GVG_TIME['START'][0], GVG_TIME['END'][0]) guildlist = breaklist_guild_now(guildlist, bef_fortlist, fortlog) guildlist = breaklist_guild_end(guildlist, now_fortlist, GVG_TIME['END'][0]) # ギルド別ハッシュを配列にソート guild_array = guildlist.sort do |x, y| x[0] <=> y[0] end return guild_array end =begin == 砦保持時間総計 =end def breaklist_guild_defense_total(breaklist) key = value = "" guildlist = {} breaklist.each { |key, value| total = 0 limit = value.length for count in 0 ... limit total += str2sec(value[count][1]) - str2sec(value[count][0]) end guildlist[key] = sec2str(total) } return guildlist end =begin == 最長保持時間 =end def breaklist_guild_defense_longer(breaklist) key = value ="" guildlist = {} breaklist.each { |key, value| longer = 0 limit = value.length for count in 0 ... limit defense = str2sec(value[count][1]) - str2sec(value[count][0]) if defense > longer longer = defense end end guildlist[key] = sec2str(longer) } return guildlist end =begin == 平均防衛時間 =end def breaklist_guild_defense_average(breaklist) key = value = "" guildlist = {} breaklist.each { |key, value| total = 0 limit = value.length for count in 0 ... limit total += str2sec(value[count][1]) - str2sec(value[count][0]) end guildlist[key] = sec2str(total / limit) } return guildlist end =begin == 点数合計 ※最初の砦所持や堅守は加算されません。 1回以上占領したギルドのみを対象とします。 === 入力 fortlist(内容:ギルド名・加算する倍率) === 出力 guildlist(内容:ギルド名・合計点数) =end def breaklist_guild_sera(breakguild, fortlist) key = value = "" guildlist = {} breakguild.each { |key, value| limit_break = limit = value.length if value == nil then next end # 配列がない場合は飛ばす for row in 0 ... limit # 最初の砦所持は占領数から除外 if value[row][0] == GVG_TIME['START'][0] limit_break -= 1 end end point = 0 for row in 0 ... limit if /(\d)$/ =~ value[row][2] fortnumber = $1.to_i - 1 # 砦番号取得 end fortcode = getfortcode(value[row][2]) # 砦地域取得 # 開始時、砦がある時は点数加算対象にしない # 実際にエンペリウムブレイクした時のみ、点数を加算する。 unless value[row][0] == GVG_TIME['START'][0] point += fortlist[fortcode][fortnumber][1] end end if point != 0 # 0点のギルドはデータに入れない。 guildlist[key] = point end } return guildlist end =begin == 連続防衛回数 === 入力 history[count_week][area][number] use_datelist[count_week] area =end def history_count(history, use_datelist, area) limit_week = use_datelist.length next_guild = now_guild = "" next_week = 0 for number in 0 ... COLUMN for count_week in 0 ... (limit_week-1) # 最終週の1回手前まで if use_datelist[count_week][1] == 1 # 攻城戦中止の時は飛ばす next end for next_week in (count_week+1) ... limit_week # 次回の攻城戦を探す if use_datelist[next_week][1] == 0 # 通常なら終了 break end end now_guild = history[count_week][area][number][0] # 現在ギルド名 next_guild = history[next_week][area][number][0] # 次回ギルド名 # 現在ギルドが空白(不明)の時は連続防衛をカウントしない。 if now_guild == '' then next end if now_guild == next_guild # 今回と次回が同じなら連続防衛と見なす。 if history[count_week][area][number][1] == 0 # 初回なら '1' history[count_week][area][number][1] = 1 end history[next_week][area][number][1] = history[count_week][area][number][1] + 1 end end end return history end