=begin = 攻城戦データ処理ライブラリ gvglib.rb, SJIS == 著作権 by silica as 冬物語の人 http://winter.sgv417.jp/ == 攻城戦ライブラリの読み込み このスクリプトはSJISです。Windows系OSで使用することを想定しています。 UNIX系OSで使用する際はスクリプトの文字コードをEUCに変換してください。 == 関数名 === 接頭辞 接頭辞はライブラリファイル名と同じです。 log : ログの読み込み、書き込み、変換 fortlist : 砦別リスト guildlist: ギルド別リスト txt : テキスト、BBS形式で出力 html : HTML形式で出力 === 名前の意味 read : 読込 write: 保存 line : 出力の文字列配列 print: 出力 make : ログ作成処理 fort : 砦 get : 値を得る == 攻城戦ログ fortlog[0:行番号, 1:[0:時刻, 1:砦地域, 2:砦番号(数字型), 3:ギルド]] == 砦別リスト fortlist[0:砦地域, 1:砦番号, 2:[0:ギルド名, 1:その他]] 1:その他: 防衛時間, 占領回数, RoWikiランキング, なし [砦地域]: 行(row): area [砦番号]: 列(column): number row×column 行列 == ギルド別リスト guildlist[0:ギルド名][1:占領回数][2:ランキング][3:獲得砦名][4:占領砦表] == 砦行 fortline[行番号] = [行内容] == 砦別占領リスト breaklist["ギルド名"][0:順番, 1:[0:占領時間, 1:ギルド名]] == ギルド別占領リスト breaklist["砦名"][0:順番, 1:[0:占領時間, 1:落城時間, 2:砦名]] [1:"落城時間"]は、22:00:00以降は確保・防衛成功とみなします。 == ハッシュ配列拡張例 ["日付"]["砦名 "][0:順番, 1:[0:占領時間, 1:ギルド名]] ["日付"]["ギルド"][0:順番, 1:[0:占領時間, 1:落城時間, 2:砦名]] 開始時間:20:00:00 終了時間:22:00:00 日付:yyyy/mm/dd =end # 攻城戦ライブラリの読み込み require 'gvglib/config.rb' # 設定・定数 require 'gvglib/log.rb' # Log require 'gvglib/fortlist.rb' # Fort require 'gvglib/guildlist.rb' # Guild require 'gvglib/text.rb' # Text require 'gvglib/html.rb' # HTML require 'gvglib/list.rb' # DB by Ruby require 'gvglib/date.rb' # 日付・時間(Dateクラス継承) require 'erb' # Erb: データテンプレート # ハッシュの要素を加算 class Hash # firstは省略可能(そのときはfirst=value) def add!(key, value, first=nil) if first.nil? then first = value end if self.key?(key) self[key] += value else # キーが存在しない時は初期値で初期化 self[key] = first end end end # リスト表示 # array : 配列 # shift_number : 改行する文字列数 def print_format(in_format, array, shift_number) limit = array.length print "以下のリストにある名前を入れてください。\n" for count in 0 ... limit print array[count] if ((count+1) % shift_number) == 0 # 改行する文字列数 print "\n" else if count == (limit-1) # 最後の文字列かどうか print "\n" else print ", " end end end end # ディレクトリチェック # ディレクトリが存在しなければディレクトリを作成する。 # ディレクトリと同名のファイルがある場合は警告して終了する。 def check_dir(dir) if FileTest.exist?(dir) == true unless FileTest.directory?(dir) == true print dir, " はディレクトリではありません。\n" print "以上の名前のファイルを削除してから再実行して下さい。\n" exit end else Dir.mkdir(dir) print "ディレクトリ ", dir, " を作成しました。\n" end end # 日付をチェックする old # 入力日付が"0"(文字列)の時は、任意の日付を指定する。 def check_argv_day(in_day, set_day) if in_day == "0" # 日付を自動決定させる out_day = set_day else out_day = in_day end return out_day end # ワールド名チェック # 入力されたワールド名が存在しなければワールド一覧を出力して終了。 # ワールド名を全部小文字に変換して返す。 # 汚染対策:入力データを返り値に代入しない。 def check_argv_world(in_world) if in_world == nil print "ワールド名が入力されていません。\n" print_format(in_world, WORLD[0], 7) exit end # in_world.downcase! # 全て小文字に強制変換 WORLD[0].each { |world| if world == in_world.downcase return world end } print "#{in_world} という名前のワールド(鯖名)はありません。\n" print_format(in_world, WORLD[0], 7) exit end # ログフォーマット名チェック # 汚染対策:入力データを返り値に代入しない。 def check_argv_logformat(in_format) format = 0 if in_format == nil print "フォーマット名が入力されていません。\n" print_format(in_format, LOGFORMAT, 5) exit end LOGFORMAT.each { |formatname| if formatname == in_format format = formatname end } if format == 0 # フォーマット名が入力されていない時 print "#{in_format} フォーマットはありません。\n" print_format(in_format, LOGFORMAT, 5) exit # 終了 end return format end =begin == 入力週分前の週を求める 過去の攻城戦中止を越えて入力週分前の週を求める =end def before_week(use_datelist, before_week) add = 0 limit_week = use_datelist.length count_week = limit_week - 1 out_before_week = count_week - before_week while count_week > 0 if add < before_week if use_datelist[count_week][1] == 1 # 攻城戦中止の時 out_before_week -= 1 end else break end add += 1 count_week -= 1 end if out_before_week < 0 # 入力週分以上前が配列にないとき out_before_week = count_week # 最古の週をセット end return out_before_week end =begin == 入力期間の日曜日リスト作成 === 入力 date_start, date_end 日付オブジェクト === 返値 use_datelist: 日曜日リスト === 日曜日限定 use_datelist[1] 0: 通常 1: 攻城戦中止 === 無効な日付 入力する無効な日付のうち 2004/09/03 - 2004/09/04 の間は商業投資可能 =end def datelist_make(date_start, date_end) use_datelist = [] # 使用日付リスト date_start = date_start.wday_after(0) # 開始日付から後の指定曜日にセット date_end = date_end.wday_before(0) # 終了日付から前の指定曜日にセット limit_week = (date_end.jd - date_start.jd) / 7 # 週数 # 最初の日曜日から最後の日曜日までのリストを作成 for count in 0 .. limit_week use_datelist[count] = [date_start.ymd, 0] date_start += 7 # 日付オブジェクトの加算 end return use_datelist end =begin == リストの中から使わない日付を削除 === date_deny 使わない日付リスト =end def datelist_delete(use_datelist) limit_week = use_datelist.length limit_deny = DENY_DATE.length for count_week in 0 ... limit_week for count_deny in 0 ... limit_deny if use_datelist[count_week][0] == DENY_DATE[count_deny] use_datelist[count_week][1] = 1 # 1: 特殊な日 "DELETE" end end end return use_datelist end =begin == 前回の日付 入力した日付が攻城戦中止のとき、前回の日付を求める。 前回の日付でも中止なら更にさかのぼる。 === 入力 日付リスト 日付(文字列) === 出力 前回の日付(中止ではないもっとも最近の日付) =end def datelist_before(use_datelist, in_date) limit_week = use_datelist.length limit_deny = DENY_DATE.length bef_ymd = in_date # 入力した日付で初期化 week = 0 for count_deny in 0 ... limit_deny # 中止リストにあるかどうか if in_date == DENY_DATE[count_deny] for count_week in 0 ... limit_week if use_datelist[count_week][0] == in_date week = count_week break end end end end while week > 0 # 過去のうち中止ではない最近の日付 if use_datelist[week][1] == 0 bef_ymd = use_datelist[week][0] break end week -= 1 end return bef_ymd end =begin == 砦地域名をコードに変換 数字型でコードを返す。 === 出力 V: 0, C: 1, B: 2, L: 3 =end def getfortcode(fortarea) fortcode = 0 if fortarea =~ /^(V|ヴァルキリ|プロ)/ then fortcode = 0 elsif fortarea =~ /^(C|チュンリム|フェイ)/ then fortcode = 1 elsif fortarea =~ /^(B|ブリトニア|ゲフェ)/ then fortcode = 2 elsif fortarea =~ /^(L|衛星都市|ルイ|アルデ)/ then fortcode = 3 else print "Error: ", fortarea, ": 砦地域名がわかりません。\n" end return fortcode end =begin == コードを砦地域名に変換 === 出力 0:省略形, 1:正式名, 2:日本語名, 3:日本語省略名, 4: 街名, 5: 街省略名 6: 英語省略名 =end def getfortarea(fortcode, fortform) fortarea = "" if fortcode == 0 then fortarea = FORT_LIST[fortcode][fortform] elsif fortcode == 1 then fortarea = FORT_LIST[fortcode][fortform] elsif fortcode == 2 then fortarea = FORT_LIST[fortcode][fortform] elsif fortcode == 3 then fortarea = FORT_LIST[fortcode][fortform] else print "Error: ", fortcode, ": 砦地域名がわかりません。\n" end return fortarea end