# fortlist(砦別リスト) =begin == 配列作成(初期化) === 入力 配列の列の数 init_data: 初期化する値 === 出力 line[列数] =end def list_init(line, init_data) list = [] for count in 0 ... line list[count] = init_data end return list end =begin == 行列作成(初期化) === 入力 行列の行と列の数 init_data: 初期化する値 === 出力 matrix[行数][列数] =end def matrix_init(limit_row, limit_column, init_data) matrix = [] # 行列の宣言 for row in 0 ... limit_row # 行数 matrix[row] = Array.new(limit_column) # 列数 end for row in 0 ... limit_row for column in 0 ... limit_column matrix[row][column] = init_data # 行列の初期化 end end return matrix end =begin == fortlist配列作成(初期化) 関数内の砦別リストはこれで新規作成すること。 この関数で新規作成した砦別リストは関数外に影響しない。 ※既存の砦別リストは、内容の変更(関数内の=による代入)が 関数内のみに収まらず、return文で関数外にも影響が及びます。 init_data: 初期化する値。普通は0, 商業値は1を入れる。 =end def fortlist_init(init_guild, init_data) fortlist = [] # 配列の宣言 for area in 0 ... ROW # 砦地域 fortlist[area] = Array.new(ROW) for number in 0 ... COLUMN # 砦番号 fortlist[area][number] = [init_guild, init_data] # 初期化 end end return fortlist end =begin == fortlist配列要素初期化 ギルド名はそのまま、全ての要素を入力した値で初期化します。 =end def fortlist_setdata(fortlist, data) setdata = fortlist_init('', 0) area = number = 0 for area in 0 ... ROW for number in 0 ... COLUMN setdata[area][number][0] = fortlist[area][number][0] setdata[area][number][1] = data end end return setdata end =begin == 砦主リスト 攻城戦ログから現在の砦主リスト作成(堅守除く) =end def fortlist_make(fortlist, fortlog) fortmake = fortlist_init('', 0) limit = fortlog.length # 占領総回数(ログの長さ) fortcode = fortnumber = 0 # 前回の結果を代入 for area in 0 ... ROW for number in 0 ... COLUMN # 配列添字を付けないと、変更が同時にされる fortmake[area][number][0] = fortlist[area][number][0] fortmake[area][number][1] = fortlist[area][number][1] end end for fort in 0 ... limit fortcode = getfortcode(fortlog[fort][1]) fortnumber = fortlog[fort][2].to_i fortmake[fortcode][fortnumber-1][0] = fortlog[fort][3] # ギルド名 end return fortmake end =begin == 砦別占領回数 攻城戦ログから砦別占領回数のリスト作成 =end def fortlist_breakcount(fortlist, fortlog) breakcount = fortlist_init('', 0) limit = fortlog.length # 占領総回数(ログの長さ) fortcode = fortnumber = 0 # 前回の結果を代入 for area in 0 ... ROW for number in 0 ... COLUMN # 配列添字を付けないと、変更が同時にされる breakcount[area][number][0] = fortlist[area][number][0] breakcount[area][number][1] = 0 # 占領回数リセット end end # 各砦のデータを次々に上書き更新して最終結果を得る for count in 0 ... limit fortcode = getfortcode(fortlog[count][1]) fortnumber = fortlog[count][2].to_i breakcount[fortcode][fortnumber-1][0] = fortlog[count][3] # ギルド名 breakcount[fortcode][fortnumber-1][1] += 1 # 該当砦の占領回数を1つ加算 end return breakcount end =begin == 砦別最終占領時間 攻城戦ログから砦別最終占領時間作成 =end def fortlist_breaktime(fortlist, fortlog) breaktime = fortlist_init('', 0) limit = fortlog.length # 占領総回数(ログの長さ) fortcode = fortnumger = 0 # 20:00:00で初期化する。無落城なら書き換わらず、このまま堅守となる for area in 0 ... ROW for number in 0 ... COLUMN breaktime[area][number] = [fortlist[area][number][0], GVG_TIME['START'][0]] end end # 各砦のデータを次々に上書き更新して最終結果を得る for count in 0 ... limit fortcode = getfortcode(fortlog[count][1]) fortnumber = fortlog[count][2].to_i breaktime[fortcode][fortnumber-1][0] = fortlog[count][3] # ギルド名 breaktime[fortcode][fortnumber-1][1] = fortlog[count][0] # 占領時間 end return breaktime end =begin == 砦別防衛時間 砦別最終占領時間から防衛時間を計算する。 === 入力 fortlist[砦地域コード][砦番号][0:[ギルド], 1:[占領時間]] === 出力 fortlist[砦地域コード][砦番号][0:[ギルド], 1:[防衛時間]] 占領時間は'24:60:60'の時刻表示 占領時間を防衛時間に書き換えて出力 占領時間が0(初期化状態)の場合、2時間防衛とみなす =end def fortlist_deftime(fortlist) deftime = fortlist_init('', 0) breaktime = defsec = endsec = persec = 0 startsec = str2sec(GVG_TIME['START'][0]) endsec = str2sec(GVG_TIME['END'][0]) # 22:00:00 => 79200sec. persec = sec2str(startsec - endsec) # 攻城戦全体時間 for area in 0 ... ROW for number in 0 ... COLUMN breaktime = fortlist[area][number][1] # 占領時間 if breaktime == 0 # 堅守の場合 deftime[area][number][1] = persec # "02:00:00" next else # 終了時間までの防衛時間(秒)を求める if str2sec(breaktime) > endsec # 取得時間が終了時間過ぎなら0秒にする defsec = 0 else defsec = endsec - str2sec(breaktime) end end deftime[area][number][0] = fortlist[area][number][0] deftime[area][number][1] = sec2str(defsec) end end return deftime end =begin == 砦別ROWikiランキング 防衛時間から点数を算出する。 === 入力 fortlist[砦地域コード][砦番号][0:ギルド, 1:防衛時間] === 出力 ranklist[砦地域コード][砦番号][0:ギルド, 1:点数] === 倍率 rate = [0.5, 1.2, 1.5, 1 ] # (V, C, B, L) rate[Valkyrie Realms, Chung-Rim Guild, Britoniah Guild, Luina Guild] ヴァルキリーレルム:0.5 チュンリム:1.2 ブリトニア:1.5 ルイーナ:1 === 点数 防衛時間5分以上で1点 防衛時間5分おきに1点加算 2時間(堅守)で6点加算 =end def fortlist_ROWikiRank(fortlist, rate) wikirank = fortlist_init('', 0) guild = period = min = sec = "" add5 = add60 = add120 = point = 0 for area in 0 ... ROW for number in 0 ... COLUMN # ギルド、防衛時間の取り出し guild, period = fortlist[area][number] # 防衛時間(秒)を求める sec = str2sec(period) # 防衛時間(分)を求める min = sec / 60 # 60分で割り切れない場合、1分追加、割り切れる場合は追加しない if (sec % 60) > 0 then add60 = 1 else add60 = 0 end # 5分以上防衛で1点 if (min % 5) > 0 then add5 = 1 else add5 = 0 end # 2時間防衛(堅守)で6点 if min >= 120 then add120 = 6 else add120 = 0 end # 点数を求める point = rate[area] * (5 + (min / 5) + add5 + add120) point = point.floor # 小数点下の切捨て wikirank[area][number] = [guild, point] # ギルド、ランク end end return wikirank end =begin == 堅守砦リスト文字列 無陥落の時、堅守と判定し堅守砦リストを作ります。 fortlist[砦地域][砦番号] = [ギルド名][占領回数] =end def fortlist_perfect_defense(fortlist) fortarea = perfect = "" for area in 0 ... ROW for number in 0 ... COLUMN # 堅守があれば堅守砦リストを作る。 if fortlist[area][number][1] == 0 fortarea = getfortarea(area, 0) # 砦省略名 if perfect == "" perfect += fortarea + (number+1).to_s else perfect += ", " + fortarea + (number+1).to_s end end end end if perfect == "" then perfect = "なし" end return perfect end =begin == レース会場リスト文字列 防衛力1未満の砦をレース会場と判定し、レース会場リストを作ります。 fortlist[砦地域][砦番号] = [ギルド名][占領回数] =end def fortlist_race(fortlist) fortarea = race = "" for area in 0 ... ROW for number in 0 ... COLUMN # レース会場リストを作る。 if fortlist[area][number][1] < 1 fortarea = getfortarea(area, 0) # 砦省略名 if race == "" race += fortarea + (number+1).to_s else race += ", " + fortarea + (number+1).to_s end end end end if race == "" then race = "なし" end return race end =begin == 砦平均EB数(小数点) 砦攻略難易度 砦平均EB数=(合計EB数+1)÷各砦EB数 =end def fortlist_average(fortlist, total_break) average = fortlist_init('', 0) for area in 0 ... ROW for number in 0 ... COLUMN average[area][number][0] = fortlist[area][number][0] if fortlist[area][number][1] != 0 average[area][number][1] = (total_break + 1) / fortlist[area][number][1].prec_f else # 堅守の場合 average[area][number][1] = (total_break + 1).prec_f end end end return average end =begin == 防衛力(小数点) 防衛力=砦平均EB数 ÷(各砦EB数+1) =end def fortlist_defense(fortlist, average) defense = fortlist_init('', 0) for area in 0 ... ROW for number in 0 ... COLUMN defense[area][number][0] = fortlist[area][number][0] if average[area][number][1] != 0 defense[area][number][1] = average[area][number][1].prec_f / (fortlist[area][number][1].prec_f + 1) else defense[area][number][1] = 0 end end end return defense end =begin == BP倍率(小数点) === BP倍率=(合計EB数+1)÷(各砦EB数+1) =end def fortlist_bprate(fortlist, total_break) bprate = fortlist_init('', 0) for area in 0 ... ROW for number in 0 ... COLUMN bprate[area][number][0] = fortlist[area][number][0] bprate[area][number][1] = (total_break + 1) / (fortlist[area][number][1] + 1).prec_f end end return bprate end =begin == 最低BP倍率 各砦BP倍率から最低BP倍率を求める =end def fortlist_min_bprate(fortlist) min_bprate = fortlist[0][0][1] # 最初の各砦BP倍率で初期化 for area in 0 ... ROW for number in 0 ... COLUMN tmp = fortlist[area][number][1] if min_bprate > tmp min_bprate = tmp end end end return min_bprate # 最低BP倍率 end =begin == オッズ(小数点) オッズ=各砦BP倍率 ÷ 最低BP倍率 =end def fortlist_odds(fortlist, min_bprate) odds = fortlist_init('', 0) min_bprate = fortlist_min_bprate(fortlist) for area in 0 ... ROW for number in 0 ... COLUMN odds[area][number][0] = fortlist[area][number][0] odds[area][number][1] = fortlist[area][number][1].prec_f / min_bprate.prec_f end end return odds end =begin == 砦別リスト加算 =end def fortlist_add(fortlist, fortlist_add) add = fortlist_init('', 0) for area in 0 ... ROW for number in 0 ... COLUMN add[area][number][0] = fortlist_add[area][number][0] # ギルド名更新 if fortlist[area][number][1] == nil # 加算するリストがないとき add[area][number][1] = 0 end if fortlist_add[area][number][1] == nil # 元のリストがないとき add[area][number] = fortlist_add[area][number][1] else add[area][number][1] = fortlist[area][number][1] + fortlist_add[area][number][1] end end end return add # 入力に加算して返します end =begin == 砦別リストの堅守回数 =end def fortlist_defadd(fortlist, defadd) defcount = fortlist_init('', 0) for area in 0 ... ROW for number in 0 ... COLUMN defcount[area][number][0] = fortlist[area][number][0] if fortlist[area][number][1] == 0 # 堅守したら加算 defcount[area][number][1] = defadd[area][number][1] + 1 else # 堅守出来なかったら堅守回数をリセット defcount[area][number][1] = 0 end end end return defcount end =begin == 合計を求める 行列の行合計、列合計、合計を求める === 入力 fortlist, 行数、列数 === 出力 行合計、列合計、合計 =end def matrix_total(fortlist, row, column) total = 0 total_row = list_init(row, 0) total_column = list_init(column, 0) for area in 0 ... row # 行合計 for number in 0 ... column total_row[area] += fortlist[area][number][1] end end for number in 0 ... column # 列合計 for area in 0 ... row total_column[number] += fortlist[area][number][1] end end for area in 0 ... row # 全合計 for number in 0 ... column total += fortlist[area][number][1] end end return total_row, total_column, total end =begin == 平均を求める 行列の行平均、列平均、全平均を求める === 入力 行合計、列合計、全合計 === 出力(小数点) 行平均、列平均、全平均 =end def matrix_average(total_row, total_column, total) row = total_row.length column = total_column.length average = 0 average_row = list_init(row, 0) average_column = list_init(column, 0) # 行の平均(row回) for area in 0 ... row average_row[area] = (total_row[area] / column).prec_f end # 列の平均(column回) for number in 0 ... column average_column[number] = (total_column[number] / row).prec_f end # 全平均 average = (total / (row * column)).prec_f return average_row, average_column, average end =begin == 商業値予想 (Commercial Point anticipation) === EB (Emperium Break) エンペ破壊回数 === CP (Commercial Point) 商業値 最低 1 最大 100 落城 -5(1回につき) 閾値 (threshold) 投資を2回から1回に切り替える時の目安の値 閾値(29, 50, 100) = (week_two, week_four, weel_all) 最初の商業値(初期値:1) 1日2回投資を7週と1日で商業値100(=99+1) =end =begin == 商業値投資 閾値で1日の投資を1回または2回にするかを決める。 ※投資を途中でやめることについては考慮しない =end def fortlist_cp_upto(fortlist, threshold) cp_upto = fortlist_init('', 0) for area in 0 ... ROW for number in 0 ... COLUMN if fortlist[area][number][1] < threshold cp_upto[area][number][1] = fortlist[area][number][1] + 2 else cp_upto[area][number][1] = fortlist[area][number][1] + 1 end if cp_upto[area][number][1] > 100 # 商業値100を越えたら修正 cp_upto[area][number][1] = 100 end end end return cp_upto end =begin == 商業値減少 落ちた回数分減らす 落城1回につき商業値-5 最低商業値は1 =end def fortlist_cp_down(fortlist, downcount) cp_down = fortlist_init('', 0) cp_diff = 0 for area in 0 ... ROW for number in 0 ... COLUMN cp_down[area][number][0] = downcount[area][number][0] cp_diff = downcount[area][number][1] * 5 cp_down[area][number][1] = fortlist[area][number][1] - cp_diff if cp_down[area][number][1] < 1 # 商業値が1未満の時 cp_down[area][number][1] = 1 end end end return cp_down end =begin == 商業値100チェック 商業値100に 0: 達していない 1: 達した(以降、商業値が下がって再び100になっても上書きされません) =end def fortlist_cp_check(fortlist, now_cp, use_date) cp_check = fortlist_init('', 0) check = 0 for area in 0 ... ROW for number in 0 ... COLUMN check = fortlist[area][number][1] if((check == 0) || (check == 1)) # 日付が入っていない時 if now_cp[area][number][1] >= 100 # 商業値100かどうか cp_check[area][number][1] = use_date end else cp_check[area][number][1] = fortlist[area][number][1] end end end return cp_check end =begin == 砦別最終占領時間 砦別防衛時間から砦別最終占領時間を計算する。 === 入力 fortlist[砦地域コード][砦番号][0:[ギルド], 1:[占領時間]] time: 時刻 (24:60:60), GVG_TIME['END'][0] === 出力 fortlist[砦地域コード][砦番号][0:[ギルド], 1:[防衛時間]] 占領時間は'24:60:60'の時刻表示 占領時間を書き換えて出力 =end def fortlist_timediff(fortlist, time) lasttime = fortlist_init('', 0) breaktime = defsec = endsec = persec = 0 for area in 0 ... ROW for number in 0 ... COLUMN lasttime[area][number][0] = fortlist[area][number][0] lasttime[area][number][1] = time_diff(time, fortlist[area][number][1]) end end return lasttime end