# VX->VXAceへの変換処理を行うか? CONVERT_VX_TO_ACE = true # データベースの変換を行うか? CONVERT_DB = true # マップの変換を行うか? CONVERT_MAP = true # 旧バージョンでAceへの変換が不十分だったデータを修正するか? # trueの状態で二回以上実行すると、一部のイベントデータが狂います。 RE_ADJUST_VX_TO_ACE = false # -*- coding: utf-8 -*- =begin ★ks_VX→VXAceデータ移行 2011/12/18 一部のイベントデータに移植ミスがあったため、 移植済みデータの修正機能の実装とともに修正更新。 2011/12/17 自然回復しないステートの設定に不備があったので修正。 2011/12/16 細かい設定項目を追加。 2011/12/15 ブツが届いたので移行が不十分な点を修正。 マップが反映されないとか、%系の効果に無茶な値が入ってたりとか。 2011/12/10 20時 スキルや使用アイテムに属性に対応した無駄データが作られていたので削除。 スキルのIDがずらした分変更されてなかったので修正。 2011/12/10 19時 VXの時の属性を保持する際の書式を設定できるように変更。 体験版での使い方を追記。 2011/12/10 18時 アイテムのHP回復効果の変換が違ったっぽいので修正。 ステート関連で幾つか数値的な間違いがあったっぽいので修正。 □===制作・著作===□ MaidensnowOnline 暴兎 見た目にまったく判らないスクリプトなので、著作権表記は必要ありません。 というか変換するとき意外は入れておく必要がないスクリプトです。 □===配置場所===□ スクリプトの一番上にでも設置して使ってください。 □===説明・使用方法===□ 1.VXAceのDataフォルダに、VXのDataフォルダの中身を丸ごと投げ込みます。 2.テストプレイを起動して、タイトル画面が出たら終了します。   グラフィックがない関係でcacheのエラーが出る場合もありますが特に問題はありません。 3.プロジェクトを保存せずにエディタを終了します。 4.起動するとデータベースとマップが変換後のものになっています。 注意・初期設定だと元々あったVXAceのデータベースは変換後データで上書きされます。 なお、変換結果が、ファイルに対応した名前でゲームフォルダに生成されます。 このファイルはUTF-8形式のテキストなので、UTF-8形式で開いて読んでください。 ※体験版で試す場合は、拡張子を.rbに変更してゲームフォルダに置き、  以下のスクリプトをイベント中で実行してください。  また、2byte文字を含むプロジェクトパスの場合エラーで実行できません。 s = File.expand_path(".") s.force_encoding('UTF-8') ss = "/ks_VX-VXAce_converter" ss.force_encoding('UTF-8') p s, ss Kernel.require s + ss □===使用上の注意===□ ・タイルセットは、VXの並びに準じたものを自分で作る必要があります。 ・色調変更など、色設定がかかわるイベントコマンドはオブジェクトの都合か、正常に移植されません。 ・経験値曲線には対応していません。 ・用語などには対応していません。 ・職業の能力値成長曲線は同じIDのアクターの能力値成長曲線を使用します。 ・魔法防御には精神力と同じ値、アクター・エネミーは更に運に敏捷性と同じ値が入ります。 ・スキル・使用アイテムの属性は、設定されている属性のうち一番初めの物に設定されますが、  元の属性はメモ欄に記録されます。 ・エリアはリージョンに変換され、重なっている場合は両方と違うリージョン番号になります。 =end # 設定項目(特に設定しなくても大丈夫)_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # %sなどが含まれる文字列の変更が必要な場合は、%s以外を編集してください。 # 変換結果のテキストファイルを出力するかの設定 PUT_RESULT = false # 変換結果のテキストファイルを出力先の相対パス POUT_DIR = "ext_paramater_log_[%s]_.txt" # 変換したファイルを出力先のファイル名(相対パス+ファイル名) # 初期値ではもともとあったAceのデータベースを上書きする設定になっているので注意。 PUT_FILE_NAME = "data/%s2" # VXのスキルや仕様アイテムの属性をメモに保持する際の書式です。 VX_ELEMENT_STR = "" class Object # IDいくつからに旧スキルを入れるか(1,2が通常攻撃、防御となったことを考慮) # また、3を逃げる、4を何もしないであると仮定して敵の行動を修正します。 # なので1〜4を予約番号として、余裕を持って10を初期設定値としています。 # クラスの習得スキル番号をずらす際にも加算されます。 GETA_FOR_SKILLS = 10 # スキル・アイテムを移行する際、基本ダメージの絶対値が1の場合、加算しない IGNORE_BASE_DAMAGE_1 = true # ダメージ計算式における旧関係度が100の時の能力値の倍率です ATK_RATE = 4 SPI_RATE = 2 DEF_RATE = 2 MDF_RATE = 1 # 武器の命中値の+-0と判定される値 DEFAULT_HIT = 95 # VXAceのデフォルトに近いダメージ計算式の表記になります。※trueの場合かなり再現限度が下がる # 例)ATK_RATE = 4、DEF_RATE = 2 で スキルが打撃関係度50 # (trueの場合) atk * 2 - def * 1 # (falseの場合) atk * 200 / 100 - def * 100 / 100 # 例)SPI_RATE = 2、MDF_RATE = 1 で スキルが精神関係度25(再現度が下がるパターン) # (trueの場合) mat * 0 - mdf * 0 # (falseの場合) mat * 50 / 100 - mdf * 25 / 100 FORMULA_TYPE_ACE = false # 旧値を特殊効果に変換する時のコード番号の表(変更不要) SPECIFY_CODE = Hash.new SPECIFY_CODE[:@speed] = 33 SPECIFY_CODE[:@element_set] = 11 SPECIFY_CODE[:@element_ranks] = 11 SPECIFY_CODE[:@state_ranks] = 13 SPECIFY_CODE[:@state_set] = 13 SPECIFY_CODE[:@plus_state_set] = 21 SPECIFY_CODE[:@minus_state_set] = 22 EQUIP_ELEMENT_SET_VALUE = Hash.new(0.5) EQUIP_STATE_SET_VALUE = Hash.new(0) # 属性有効度のランクをAceの効果変動に変換するときの対応表 RANK_TO_VALUE_E = Hash.new(0=>200, 1=>200, 2=>150, 3=>nil, 4=>50, 5=>0, 6=>0) # 特定の属性IDだけランクに対応する耐性値を変更したい場合に設定する RANK_TO_VALUE_E[0] = {0=>200, 1=>200, 2=>150, 3=>nil, 4=>50, 5=>0, 6=>0} # 状態有効度のランクをAceの効果変動に変換するときの対応表 RANK_TO_VALUE_S = Hash.new(0=>200, 1=>nil, 2=>20, 3=>40, 4=>60, 5=>80, 6=>100) # 特定のステートIDだけランクに対応する耐性値を変更したい場合に設定する RANK_TO_VALUE_S[0] = {0=>200, 1=>200, 2=>150, 3=>nil, 4=>50, 5=>0, 6=>0} # 旧能力値と名前が違う変数の変換表(変更不要) # ちなみに、ここで変換先が指定されておらず、新しいデータにない値は移植されない。 # (変換前後でキーが変わってなくても、ここで設定されていれば移植される) CONVERT_TO_ACE_KEYS = { :@new_data=>nil, #:@name=>:@item_name, #新旧で変数名が違う場合の表記例 #:@jet =>:@jet, #新しいデータにない値を移植したい場合の表記例 } # 特殊効果が挿入される配列 def sepecifi_set #p self.class, @id, *@features @features ||= [] return @features end # 特殊効果としてsepecifi_setの配列に挿入されるデータのクラス(変更不要) SPECIFY_CLASS = RPG::BaseItem::Feature end class RPG::UsableItem # 旧値を特殊効果に変換する時のコード番号の表(変更不要) SPECIFY_CODE = Hash.new SPECIFY_CODE[:@state_set] = 32 SPECIFY_CODE[:@element_set] = 31 SPECIFY_CODE[:@state_set] = 32 EQUIP_ELEMENT_SET_VALUE = Hash.new(0) EQUIP_STATE_SET_VALUE = Hash.new(0.60) # 特殊効果が挿入される配列 def sepecifi_set #p self.class, @id, *@effects @effects ||= [] return @effects end # 特殊効果としてsepecifi_setの配列に挿入されるデータのクラス(変更不要) SPECIFY_CLASS = RPG::UsableItem::Effect end class RPG::Weapon SPECIFY_CODE = RPG::UsableItem::SPECIFY_CODE.dup SPECIFY_CODE[:@state_set] = 13 EQUIP_ELEMENT_SET_VALUE = RPG::UsableItem::EQUIP_ELEMENT_SET_VALUE EQUIP_STATE_SET_VALUE = RPG::UsableItem::EQUIP_STATE_SET_VALUE end class RPG::State SPECIFY_CODE = Hash.new SPECIFY_CODE[:@state_set] = 14 end class RPG::Armor SPECIFY_CODE = RPG::State::SPECIFY_CODE end # 設定項目終了_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ class RPG::BaseItem::Feature def value1=(v) @value = v end def value1 return @value || 0 end def value2 return 0 end TO_S = "<%s code:%2s data_id:%3s value:%3d>" def to_s return sprintf(TO_S, self.class, @code, @data_id, @value) end end class RPG::UsableItem::Effect TO_S = "<%s code:%2s data_id:%3s value1:%3d value2:%3d>" def to_s return sprintf(TO_S, self.class, @code, @data_id, @value1, @value2) end end class RPG::UsableItem::Damage TO_S = "<%s type:%1s element_id:%3s variance:%3s critical:%s\n  formula:%s>" def to_s return sprintf(TO_S, self.class, @type, @element_id, @variance, @critical, @formula) end end module Kernel @@last_pp_name = "" COLUMN_STR = "%s %s\r" CR_STR = "\r/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_\r" PRINT_LINE_STR = " %s\r" def pp(*args) return unless PUT_RESULT f = File.open(sprintf(POUT_DIR, $filename), "a:UTF-8") if @@last_pp_name != args[1] f.write(CR_STR) f.write(sprintf(COLUMN_STR, *args[0,2])) @@last_pp_name = args[1] end args.shift args.shift args.each{|str| f.write(sprintf(PRINT_LINE_STR, str)) } f.close end end module Kernel def force_encoding_to_utf_8 return self end end class NilClass def convert_to_ace return self end end class String UTF_8 = 'UTF-8' def force_encoding_to_utf_8 self.force_encoding(UTF_8) if $VXAce && !self.frozen? return self end def convert_to_ace return self.force_encoding_to_utf_8 end end class TrueClass def convert_to_ace return self end end class FalseClass def convert_to_ace return self end end class Numeric def convert_to_ace return self end end class Table def convert_to_ace return self end end class Object FEATURE_ELEMENT_RATE = 11 # 属性有効度 FEATURE_DEBUFF_RATE = 12 # 弱体有効度 FEATURE_STATE_RATE = 13 # ステート有効度 FEATURE_STATE_RESIST = 14 # ステート無効化 FEATURE_PARAM = 21 # 通常能力値 FEATURE_XPARAM = 22 # 追加能力値 FEATURE_SPARAM = 23 # 特殊能力値 FEATURE_ATK_ELEMENT = 31 # 攻撃時属性 FEATURE_ATK_STATE = 32 # 攻撃時ステート FEATURE_ATK_SPEED = 33 # 攻撃速度補正 FEATURE_ATK_TIMES = 34 # 攻撃追加回数 FEATURE_STYPE_ADD = 41 # スキルタイプ追加 FEATURE_STYPE_SEAL = 42 # スキルタイプ封印 FEATURE_SKILL_ADD = 43 # スキル追加 FEATURE_SKILL_SEAL = 44 # スキル封印 FEATURE_EQUIP_WTYPE = 51 # 武器タイプ装備 FEATURE_EQUIP_ATYPE = 52 # 防具タイプ装備 FEATURE_EQUIP_FIX = 53 # 装備固定 FEATURE_EQUIP_SEAL = 54 # 装備封印 FEATURE_SLOT_TYPE = 55 # スロットタイプ FEATURE_ACTION_PLUS = 61 # 行動回数追加 FEATURE_SPECIAL_FLAG = 62 # 特殊フラグ FEATURE_COLLAPSE_TYPE = 63 # 消滅エフェクト FEATURE_PARTY_ABILITY = 64 # パーティ能力 #-------------------------------------------------------------------------- # ● 定数(特殊フラグ) #-------------------------------------------------------------------------- FLAG_ID_AUTO_BATTLE = 0 # 自動戦闘 FLAG_ID_GUARD = 1 # 防御 FLAG_ID_SUBSTITUTE = 2 # 身代わり FLAG_ID_PRESERVE_TP = 3 # TP持ち越し #-------------------------------------------------------------------------- # ● 定数(能力強化/弱体アイコンの開始番号) #-------------------------------------------------------------------------- ICON_BUFF_START = 64 # 強化(16 個) ICON_DEBUFF_START = 80 # 弱体(16 個) #-------------------------------------------------------------------------- # ● 定数(使用効果) #-------------------------------------------------------------------------- EFFECT_RECOVER_HP = 11 # HP 回復 EFFECT_RECOVER_MP = 12 # MP 回復 EFFECT_GAIN_TP = 13 # TP 増加 EFFECT_ADD_STATE = 21 # ステート付加 EFFECT_REMOVE_STATE = 22 # ステート解除 EFFECT_ADD_BUFF = 31 # 能力強化 EFFECT_ADD_DEBUFF = 32 # 能力弱体 EFFECT_REMOVE_BUFF = 33 # 能力強化の解除 EFFECT_REMOVE_DEBUFF = 34 # 能力弱体の解除 EFFECT_SPECIAL = 41 # 特殊効果 EFFECT_GROW = 42 # 成長 EFFECT_LEARN_SKILL = 43 # スキル習得 EFFECT_COMMON_EVENT = 44 # コモンイベント #-------------------------------------------------------------------------- # ● 定数(特殊効果) #-------------------------------------------------------------------------- SPECIAL_EFFECT_ESCAPE = 0 # 逃げる attr_reader :new_data def convert_to_ace begin @new_data = self.class.new rescue @new_data = self.class.new(0,0) rescue msgbox_p self.class @new_data = self.class.new end $depth += 1 #msgbox_p @id, @name, @new_data.name, @new_data unless @name.nil? || @name.empty? || @id < 41 instance_variables.each{|key| value = self.instance_variable_get(key) set_converted_to_ace(@new_data, key, value) } unless @new_data.sepecifi_set.nil? @new_data.sepecifi_set.sort{|a, b| begin b.code * 100000000 + b.data_id * 1000000 + b.value1 * 1000 + b.value2 <=> a.code * 100000000 + a.data_id * 1000000 + a.value1 * 1000 + a.value2 rescue msgbox_p a, b end } end #name = @new_data.instance_variable_get(:@name) if $depth == 1 vz = @new_data.instance_variable_get(:@note) name = @new_data.instance_variable_get(:@name) || @new_data.to_s #msgbox_p i, type, name, @new_data, " " if vv.nil? && vx.nil? pp @id, name, @new_data @new_data.instance_variables.each{|key| next if key == :@features next if key == :@effects next if key == :@note pp @id, name, "#{key} : #{@new_data.instance_variable_get(key)}" } pp @id, name, vz.gsub("\n"){""} unless vz.nil? end $depth -= 1 return @new_data end def set_converted_to_ace(new_data, key, value) @converted_key = false key = convert_to_ace_key(key) return if key.nil? if key == :@element_set || key == :@element_ranks return element_set_convert_to_ace(key, value) elsif key == :@state_set || key == :@state_ranks || key == :@plus_state_set || key == :@minus_state_set return state_set_convert_to_ace(key, value) end return if !@converted_key && @new_data.instance_variable_get(key).nil? @new_data.instance_variable_set(key, value.convert_to_ace) #msgbox_p key, value, @new_data.instance_variable_get(key) end def convert_to_ace_key(key) vv = self.class::CONVERT_TO_ACE_KEYS[key] vv = CONVERT_TO_ACE_KEYS[key] if vv.nil? if !vv.nil? key = vv @converted_key = true end #msgbox_p key, vv return key end def specifi_code(key) result = self.class::SPECIFY_CODE[key] || SPECIFY_CODE[key] msgbox_p self.class, @name, key, result if result.nil? return result end def new_specifi(code, data_id, value, value2 = nil) msgbox_p caller[0] if code.nil? ndat = self.class::SPECIFY_CLASS.new ndat.code = code ndat.data_id = data_id ndat.value1 = value ndat.value2 = value2 unless value2.nil? @new_data.sepecifi_set << ndat return ndat end def element_set_convert_to_ace(key, set) code = specifi_code(key) if Array === set dvalue = self.class::EQUIP_ELEMENT_SET_VALUE set.each{|data_id| next if data_id == 0 value = dvalue[data_id] msgbox_p @name, key, code, data_id, value if code.nil? new_specifi(code, data_id, value) } elsif Table === set values = RANK_TO_VALUE_E set.xsize.times{|data_id| next if data_id == 0 value = values[data_id][set[data_id]] next if value.nil? new_specifi(code, data_id, value / 100.0) } end end def state_set_convert_to_ace(key, set) code = specifi_code(key) if Array === set dvalue = self.class::EQUIP_STATE_SET_VALUE set.each{|data_id| next if data_id == 0 value = dvalue[data_id] new_specifi(code, data_id, value) } elsif Table === set values = RANK_TO_VALUE_E set.xsize.times{|data_id| next if data_id == 0 value = values[data_id][set[data_id]] next if value.nil? new_specifi(code, data_id, value / 100.0) } end end end class RPG::Actor def convert_to_ace super [@weapon_id, @armor1_id, @armor2_id, @armor3_id, @armor4_id].each_with_index{|item_id, i| @new_data.equips[i] = item_id } new_specifi(FEATURE_SLOT_TYPE, 1, 1) if @two_swords_style new_specifi(FEATURE_EQUIP_FIX, 1, 0) if @fix_equipment new_specifi(FEATURE_SPECIAL_FLAG, 1, FLAG_ID_AUTO_BATTLE) if @auto_battle new_specifi(FEATURE_SPARAM, 1, 0.25) if @super_guard new_specifi(FEATURE_SPARAM, 3, 2.0) if @pharmacology new_specifi(FEATURE_XPARAM, 2, 4) if @critical_bonus return @new_data end end class RPG::Class def convert_to_ace super #new_specifi(FEATURE_SPARAM, 0, ) @new_data.sepecifi_set[0].value = (100 - @position * 25) / 100.0 actor = $now_data[@id] now_params = actor.instance_variable_get(:@parameters) [0, 1, 2, 3, 4, 4, 5, 5].each_with_index{|key, j| @new_data.params.ysize.times{|k| @new_data.params[j, k] = now_params[key, k] } } return @new_data end end class RPG::Class::Learning def convert_to_ace super @new_data.skill_id += Object::GETA_FOR_SKILLS return @new_data end end class RPG::Enemy::Action def convert_to_ace super if @kind == 0 case @basic when 0 @new_data.skill_id = 1 when 1 @new_data.skill_id = 2 when 2 @new_data.skill_id = 3 when 3 @new_data.skill_id = 4 end else @new_data.skill_id += Object::GETA_FOR_SKILLS end return @new_data end end class RPG::Enemy def convert_to_ace super [@maxhp, @maxmp, @atk, @def, @spi, @spi, @agi, @agi].each_with_index{|value, i| @new_data.params[i] = value } @new_data.sepecifi_set[0].value = @hit / 100.0 @new_data.sepecifi_set[1].value = @eva / 100.0 [@drop_item1, @drop_item2].each_with_index{|data, i| dat = RPG::Enemy::DropItem.new dat.kind = data.kind case data.kind when 1; dat.data_id = data.instance_variable_get(:@item_id) when 2; dat.data_id = data.instance_variable_get(:@weapon_id) when 3; dat.data_id = data.instance_variable_get(:@armor_id) end dat.denominator = data.denominator @new_data.drop_items[i] = dat } @levitate = false new_specifi(FEATURE_XPARAM, 2, 0.10) if @has_critical return @new_data end end class RPG::BaseItem end class RPG::UsableItem def convert_to_ace e_set = remove_instance_variable(:@element_set) super new_specifi(EFFECT_COMMON_EVENT, @common_event_id, 0) if @common_event_id != 0 unless e_set.empty? txt = "" e_set.each{|i| txt += ", " unless txt.empty? txt += i.to_s } @new_data.note += sprintf(VX_ELEMENT_STR, txt) end @new_data.damage.element_id = e_set[0] || 0 if @base_damage != 0 txt = "" txt += "#{@base_damage.abs}" if !IGNORE_BASE_DAMAGE_1 || @base_damage.abs != 1 if @atk_f != 0 txt += " + " unless txt.empty? txt += "a.atk * #{ATK_RATE * @atk_f / 100} - b.def * #{DEF_RATE * @atk_f / 100}" if FORMULA_TYPE_ACE txt += "a.atk * #{ATK_RATE * @atk_f} / 100 - b.def * #{DEF_RATE * @atk_f} / 100" if !FORMULA_TYPE_ACE end if @spi_f != 0 txt += " + " unless txt.empty? txt += "a.mat * #{SPI_RATE * @spi_f / 100} - b.mdf * #{MDF_RATE * @spi_f / 100}" if FORMULA_TYPE_ACE txt += "a.mat * #{SPI_RATE * @spi_f} / 100 - b.mdf * #{MDF_RATE * @spi_f} / 100" if !FORMULA_TYPE_ACE end @new_data.damage.type = 1 unless txt.empty? txt.gsub!("\s*(+|-)\s*b.(def|mdf)"){""} if @ignore_defense @new_data.damage.formula = txt @new_data.damage.type = 1 end @new_data.damage.type = 2 if @damage_to_mp if @base_damage < 0 @new_data.damage.type += 2 elsif @absorb_damage @new_data.damage.type += 4 end @new_data.damage.variance = 20 @new_data.hit_type = 1 if @physical_attack return @new_data end end class RPG::Skill def convert_to_ace super @new_data.id += Object::GETA_FOR_SKILLS @new_data.success_rate = @hit @new_data.stype_id = 1 if @spi_f > 0 return @new_data end end class RPG::Item def convert_to_ace super #@consumable = true @new_data.success_rate = 100 if @hp_recovery_rate != 0 || @hp_recovery != 0 new_specifi(EFFECT_RECOVER_HP, 0, @hp_recovery_rate / 100.0, @hp_recovery) end if @mp_recovery_rate != 0 || @mp_recovery != 0 new_specifi(EFFECT_RECOVER_MP, 0, @mp_recovery_rate / 100.0, @mp_recovery) end if @parameter_type != 0 new_specifi(EFFECT_GROW, @parameter_type, @parameter_points) end return @new_data end end class RPG::Weapon def convert_to_ace super @new_data.sepecifi_set[1].value = (@hit - DEFAULT_HIT) / 100.0 unless @element_set.include?(1) @new_data.sepecifi_set.delete(@new_data.sepecifi_set.find{|dat| dat.code == FEATURE_ATK_ELEMENT && dat.data_id == 1# && dat.value == 0 }) end @two_handed = false [@atk, @def, @spi, @spi, @agi, 0].each_with_index{|value, i| @new_data.params[i + 2] = value } new_specifi(33, 0, 99999999) if @fast_attack new_specifi(FEATURE_XPARAM, 2, 4) if @critical_bonus new_specifi(FEATURE_ATK_TIMES , 0, 1) if @dual_attack return @new_data end end class RPG::Armor def convert_to_ace super @atype_id = @kind || 0 @new_data.sepecifi_set[0].value = @eva / 100.0 [@atk, @def, @spi, @spi, @agi, 0].each_with_index{|value, i| @new_data.params[i + 2] = value } new_specifi(FEATURE_XPARAM , 3, 1000) if @prevent_critical new_specifi(FEATURE_SPARAM , 4, 0.5) if @half_mp_cost new_specifi(FEATURE_SPARAM , 9, 2) if @double_exp_gain new_specifi(FEATURE_XPARAM , 7, 0.10) if @auto_hp_recover return @new_data end end class RPG::State def convert_to_ace restriction = remove_instance_variable(:@restriction) super new_specifi(FEATURE_STYPE_SEAL, 1, 1) if restriction == 1 new_specifi(FEATURE_XPARAM, 1, -1000) if restriction == 5 restriction -= 1 if restriction == 2 || restriction == 5 @new_data.restriction = restriction [:@atk_rate, :@def_rate, :@spi_rate, :@spi_rate, :@agi_rate].each_with_index{|key, i| vv = instance_variable_get(key) next if vv == 100 new_specifi(FEATURE_PARAM , i + 2, vv / 100.0) } new_specifi(FEATURE_XPARAM , 7, -0.1) if @slip_damage @new_data.remove_at_battle_end = @battle_only @new_data.chance_by_damage = 100 if @release_by_damage @new_data.min_turns = @hold_turn @new_data.max_turns = @hold_turn @new_data.auto_removal_timing = 2 if (1..99) === @auto_release_prob @new_data.max_turns *= 100 @new_data.max_turns, v = @new_data.max_turns.divmod(@auto_release_prob) @new_data.max_turns += 1 if v > 0 elsif @auto_release_prob == 0 @new_data.auto_removal_timing = 0 end return @new_data end end module RPG RESION_SIZE = Hash.new(0) class Area def convert_to_ace $now_data = load_data(sprintf("Data/Map%03d.rvdata2", @map_id)) super resion = RESION_SIZE[@map_id] resionear = (0b1 << resion) << 8 @encounter_list.each_with_index{|data, i| ndat = RPG::Map::Encounter.new ndat.troop_id = data ndat.region_set << resionear $now_data.encounter_list << ndat } p "#{sprintf("Data/Map%03d.rvdata2", @map_id)} #{resion} #{resionear}" @rect.width.times{|i| xx = @rect.x + i @rect.height.times{|j| yy = @rect.y + j #p "x:#{xx} y:#{yy}" $now_data.data[xx, yy, 3] |= resionear } } RESION_SIZE[@map_id] += 1 save_data($now_data, sprintf("Data/Map%03d.rvdata2", @map_id)) return @new_data end end end class RPG::Map def convert_to_ace super list = @new_data.encounter_list list.each_with_index{|data, i| next if data.nil? list[i] = RPG::Map::Encounter.new list[i].troop_id = data } map = @new_data.data map.resize(map.xsize, map.ysize, 4) return @new_data end end class NilClass def convert_to_ace return self end end class Array def convert_to_ace $depth += 1 new_data = Array.new self.each_with_index{|value, i| type = 0 new_data[i] = value.nil? ? value : value.convert_to_ace name = new_data[i].instance_variable_get(:@name) if $depth == 1 && !name.nil? && !name.empty?# && i > 40 vv = new_data[i].instance_variable_get(:@features) vx = new_data[i].instance_variable_get(:@effects) vz = new_data[i].instance_variable_get(:@note) #msgbox_p i, type, name, new_data[i], " " if vv.nil? && vx.nil? pp i, name, new_data[i] new_data[i].instance_variables.each{|key| next if key == :@features next if key == :@effects next if key == :@note pp i, name, "#{key} : #{new_data[i].instance_variable_get(key)}" } pp i, name, *vv unless vv.nil? pp i, name, *vx unless vx.nil? pp i, name, vz.gsub("\n"){""} unless vz.nil? end } $depth -= 1 return new_data end end class Hash def convert_to_ace new_data = Hash.new new_data.default = self.default self.each_with_index{|(key, value), i| new_data[key] = value.convert_to_ace } return new_data end end class Color def convert_to_ace return self end end class RPG::EventCommand def convert_to_ace super @new_data.re_convert_to_ace return @new_data end def re_convert_to_ace case @code when 111 case @parameters[0] when 4 @parameters[2] += 1 if @parameters[2] >= 2 @parameters[3] += Object::GETA_FOR_SKILLS if @parameters[2] == 3 #p @code, @parameters end when 122 case @parameters[3] when 3..7 @parameters.insert(4, @parameters[3]) @parameters[3] = 3 #p @code, @parameters end when 311..318 siz = [6,5,4,2,6,6,6,4][@code - 311] @parameters.unshift(0) if @parameters.size < siz p @code, @parameters @parameters[-1] += Object::GETA_FOR_SKILLS if @code == 318 end return self end end if CONVERT_VX_TO_ACE# 実行するか切り替え database_files = [ "Areas.rvdata", "Actors.rvdata", "Classes.rvdata", "Enemies.rvdata", "Skills.rvdata", "Items.rvdata", "Weapons.rvdata", "Armors.rvdata", "States.rvdata", "Troops.rvdata", "Armors.rvdata", "Animations.rvdata", "System.rvdata", "MapInfos.rvdata", "CommonEvents.rvdata", ] Dir::entries("data/").reverse!.each{|filename| $depth = 0 $filename = filename now_file_nem = "data/%s" new_file_nem = PUT_FILE_NAME #if database_files.include?(filename) if filename == "System.rvdata" File.open(sprintf(POUT_DIR, $filename), "w") if PUT_RESULT p "#{filename} の変換を開始" $now_data = load_data(sprintf(new_file_nem, filename)) $old_data = load_data("data/#{filename}") $now_data.elements = $old_data.elements $new_data = $now_data else case filename when "Areas.rvdata" next unless CONVERT_DB when "Classes.rvdata" next unless CONVERT_DB $now_data = load_data("data/Actors.rvdata") when /map\d{3}\.rvdata$/i next unless CONVERT_MAP $now_data = load_data("Data/MapInfos.rvdata") else next unless CONVERT_DB next unless database_files.include?(filename) end File.open(sprintf(POUT_DIR, $filename), "w") if PUT_RESULT p "#{filename} の変換を開始" $old_data = load_data("data/#{filename}") $new_data = $old_data.convert_to_ace case filename when "Areas.rvdata" next when "Skills.rvdata" $now_data = load_data(sprintf(now_file_nem, filename)) size = Object::GETA_FOR_SKILLS $new_data.shift $new_data.unshift(*$now_data[0,size+1]) else end #msgbox_p "data/#{filename} の変換に成功。" end save_data($new_data, sprintf(new_file_nem, filename)) #end } RE_ADJUST_VX_TO_ACE = false end# CONVERT_VX_TO_ACE if RE_ADJUST_VX_TO_ACE && !$@ msgbox_p "旧バージョンで変換ミスがあったデータを再変換します", "この処置を、新バージョンで変換したデータや、修正済みのデータに対して適用すると、", "一部のイベントデータが異常な値になります。" msgbox_p "実行を中止する場合は、F12を押しながらエンターキーを押し、", "その後テストプレイを中止終了してください。" msgbox_p "再変換を実行します。" module Kernel def re_convert_to_ace instance_variables.each{|key| value = self.instance_variable_get(key).re_convert_to_ace self.instance_variable_set(key, value) } return self end end class NilClass def re_convert_to_ace return self end end class Array def re_convert_to_ace $depth += 1 self.each_with_index{|value, i| self[i] = value.re_convert_to_ace } $depth -= 1 return self end end class Hash def re_convert_to_ace self.each_with_index{|(key, value), i| self[key] = value.re_convert_to_ace } return self end end Dir::entries("data/").reverse!.each{|filename| $depth = 0 $filename = filename now_file_nem = "data/%s" new_file_nem = "data/%s" #if database_files.include?(filename) case filename when /map\d{3}\.rvdata2$/i when /CommonEvents.rvdata2$/i else next end p "#{filename} の再変換を開始" $old_data = load_data("data/#{filename}") $new_data = $old_data.re_convert_to_ace save_data($new_data, sprintf(new_file_nem, filename)) } end# if RE_ADJUST_VX_TO_ACE