设为首页收藏本站同能贴吧 切换语言 繁体中文
开启辅助访问 切换到窄版
扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 84|回复: 0

[转载发布] Add Note Support for XP Database

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    2026-7-12 04:10
  • 签到天数: 209 天

    连续签到: 2 天

    [LV.7]常住居民III

    9015

    主题

    864

    回帖

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    58751
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    68660

    灌水之王

    发表于 2026-7-26 12:15:03 | 显示全部楼层 |阅读模式
    This sole-created script adds no game-performing features, only to add a "Note" field support for XP database, which is a later-generation feature starting from RGSS2.
    The Note support will open a new horizon for game scripting, save numerous efforts on tampering with massive configurations before a customized script, and make it simpler and neater to create your own functions.

    Special: The WILD MODE (default on) support allows you to override database values, so you can have weapons attack > 1000, attack < 0, or skills with atk_f, dex_f... over 200, or create potions that recovers 999999 HP.

    For more help, just read the text before the script.

                    Ruby:       
    1. #==============================================================================
    2. # ■ [Data Note] General Note Field for XP by SailCat
    3. #------------------------------------------------------------------------------
    4. #   Introduction:
    5. #      This script "adds" a general Note field support for RPG Maker XP
    6. #   database, which is a later-generation feature starting from VX.
    7. #      The Note field is parsed automatically as Ruby Hash objects for easier
    8. #   use in scripting.
    9. #
    10. #   Installation Guide:
    11. #      Insert this script before the "Main" section, preferably right after
    12. #   Scene_Debug, or before as many custom scripts as possible.
    13. #
    14. #   Date of release:
    15. #      Sep. 1, 2024
    16. #
    17. #   Effects:
    18. #   1. Splits "Name" (Actors, Classes, Enemies, States, Animations, Tileset)
    19. #      field as a place where you write notes. (max = 40 chars)
    20. #   2. Splits "Description" (Items, Skills, Weapons, Armors) field as a place
    21. #      where you write notes. (max = 100 chars)
    22. #   3. Splits "Name" of Events and Maps as a place for notes. (max = 100 chars)
    23. #   4. In case you need longer notes, use labels to link to a storage common
    24. #      event, or a file.
    25. #   5. For event pages. Write notes in the "comment" command consecutively in
    26. #      the beginning of the command list w/o limitations.
    27. #      This applys to map event pages, troop event pages, and common events.
    28. #
    29. #   How to use:
    30. #
    31. #   1. Default Notes:
    32. #      1) Use "#" char (default as configurated) to split the regular name or
    33. #         description with your notes. (as if writing comments for ruby)
    34. #         Ex: an item with a description "Recovers HP." and note "concoct=12"
    35. #            is written as "Recovers HP.#concoct=12"
    36. #      2) Use ";" char (default as configurated) to split note sections.
    37. #         Ex: a note split as "concoct=12" and "wearout=60" is written as
    38. #            "#concoct=12;wearout=60"
    39. #
    40. #   2. Extra Notes, choose either:
    41. #      1) Use "#>" + label name to refer to a label in the common event.
    42. #      2) Use "#<" + label name to refer to a label in a INI file.
    43. #
    44. #   3. Note Value-Pairs:
    45. #      Write as standard: key=value, such as "concoct=12"
    46. #        the key must be a valid ruby identifier
    47. #        the value must be a valid ruby expression
    48. #      or simplify as:
    49. #        key or key+       for   key=true
    50. #        key-              for   key=false
    51. #        key:string        for   key="string"
    52. #        key.label         for   key=(refer to a label section in common event)
    53. #        key=v[1]          for   key=$game_variables[1]
    54. #      Why simplify? You have 40 or 100 chars only for a standard note.
    55. #      In case a semi-colon ";" char is used in value, use "\;" to escape.
    56. #
    57. #   4. Using Notes in your own script:
    58. #      In RGSS, use object._key(default_value) to get the value.
    59. #      Ex: Your character 1 is NAMED as "Alexus#a;b=4;c=5"
    60. #          $data_actors[1].name       # => "Alexus"
    61. #          $data_actors[1]._a         # => true
    62. #          $data_actors[1]._b         # => 4
    63. #          $data_actors[1]._c         # => 5
    64. #          $data_actors[1]._d         # => nil --unused key returns nil
    65. #          $data_actors[1]._d(2)      # => 2   --unused key returns default
    66. #      Ex: Your skill 1 is DESCRIBED as
    67. #            "Recovers HP for an ally.#f:a.atk - b.def / 2;cd=1.5;no_ref-"
    68. #          $data_skills[1]._f         # => "a.atk - b.def / 2"
    69. #          $data_skills[1]._cd        # => 1.5
    70. #          $data_skills[1]._no_ref    # => false
    71. #      Mind that setting a note for one entry will not add it to other entries
    72. #          $data_skills[2]._f         # => nil
    73. #      unless you set note f=xx or f:xx for it as well.
    74. #
    75. #   5. For neater scripting and to save the trouble of setting a note for
    76. #      every entry, we strongly recommend to encapsulate the note fields in
    77. #      your own script, and assign default values. For example:
    78. #
    79. #      module RPG
    80. #        class Actor
    81. #          def gender;          _a(false);    end
    82. #          def age;             _b(0);        end
    83. #          def skill_per_level; _c(1);        end
    84. #          def perk_count;      _d(2);        end
    85. #        end
    86. #        class Skill
    87. #          def formula;         _f("");       end
    88. #          def cooldown;        _cd(1.0);     end
    89. #          def reflectable;     !_no_ref;     end
    90. #        end
    91. #      end
    92. #
    93. #      Then you can use:
    94. #          $data_actors[1].gender             # => true
    95. #          $data_actors[1].age                # => 4
    96. #          $data_actors[1].skill_per_level    # => 5
    97. #          $data_actors[1].perk_count         # => 2
    98. #          $data_skills[1].formula            # => "a.atk - b.def / 2"
    99. #          $data_skills[1].cooldown           # => 1.5
    100. #          $data_skills[1].reflectable        # => true
    101. #          $data_skills[2].formula            # => ""
    102. #          $data_skills[2].cooldown           # => 1.0
    103. #          $data_skills[2].reflectable        # => true
    104. #      For any entry with or without notes.
    105. #
    106. #   6. WILD MODE: you can use note to override database default values.
    107. #      When WILD MODE is activated (by default), you can override default
    108. #      values by writing a note whose key corresponds to an existing field.
    109. #      Ex: Your Weapon 1 is DESCRIBED as "An sword made of iron.#atk=1016"
    110. #          $data_skills[1].atk                # => 1016
    111. #      This is useful when you need a value that is beyond database limits.
    112. #      (Only number fields is allowed in this case)
    113. #
    114. #   7. This script offers an easy interface for Note only, and without any
    115. #      functions or features that deal with the notes. We leave them to your
    116. #      own innovations and imaginations.
    117. #
    118. #   8. Writing Extra Notes in common events.
    119. #      1) Always use an EEP command before the common event you referred to.
    120. #      2) Use a unique Label command to mark a label section for reference.
    121. #      3) Use "Show Text", "Comment" "Script" or "Conditional Branch: Script"
    122. #         to write the note text.
    123. #         * Conditional Branch: Script allows 10000 characters maximum, which
    124. #           will more than suffice.
    125. #      4) Refer to this label as either #key.label or #>label
    126. #      Ex: Common Event 1
    127. #          - End Event Processing
    128. #          - Label: Alexus_pro
    129. #          - Comment: A warrior that excels at swordfighting, born in
    130. #                     190 here.
    131. #          - Label: Alexus
    132. #          - Comment: age=16; sex:M; profile.Alexus_pro
    133. #          - Label: Basil
    134. #          - ......
    135. #          Actor 1 Name: Alexus #>Alexus
    136. #          $data_actors[1]._age               # => 16
    137. #          $data_actors[1]._profile           # =>
    138. #               "A warrior that excels at swordfighting, born in\n190 here."
    139. #      You can simply write "#>" without a label name, when the label name is
    140. #      the entry name itself.
    141. #
    142. #   9. Writing Extra Notes in INI files.
    143. #      1) Follow the standard INI file format:
    144. #       Ex: [Dorothy]
    145. #           profile=Dorothy, a thief
    146. #           age=28
    147. #           gender=F
    148. #           height=175
    149. #           weight=60
    150. #           is_dual_wield=false
    151. #      2) Refer to this label using "#<"
    152. #       Ex: Actor 4 Name: Dorothy #<
    153. #           $data_actors[4]._profile          # => "Dorothy, a thief"
    154. #           $data_actors[4]._age              # => 28
    155. #==============================================================================
    156. #==============================================================================
    157. # ■ SailCat's XP Plugins
    158. #==============================================================================
    159. module SailCat
    160.   #--------------------------------------------------------------------------
    161.   # ● Configurations
    162.   #--------------------------------------------------------------------------
    163.   module DataNoteCore_Config
    164.     SEPARATOR = "#"               # Separator before Note
    165.     DELIMITER = ";"               # Separator between note sections (K/V pairs)
    166.     NOTE_LABEL_CHAR = ?>          # Marker for extra long notes in common event
    167.     NOTE_FILE_CHAR = ?<           # Marker for extra long notes in INI file
    168.     NOTE_FILE = "Data/Note.ini"   # File name for the INI file
    169.     ACTOR_COMMON_EVENT_ID = 1     # Common event ID for Notes for Actors
    170.     CLASS_COMMON_EVENT_ID = 2     # Common event ID for Notes for Classes
    171.     SKILL_COMMON_EVENT_ID = 3     # Common event ID for Notes for Skills
    172.     ITEM_COMMON_EVENT_ID = 4      # Common event ID for Notes for Items
    173.     WEAPON_COMMON_EVENT_ID = 5    # Common event ID for Notes for Weapons
    174.     ARMOR_COMMON_EVENT_ID = 6     # Common event ID for Notes for Armors
    175.     ENEMY_COMMON_EVENT_ID = 7     # Common event ID for Notes for Enemies
    176.     STATE_COMMON_EVENT_ID = 8     # Common event ID for Notes for States
    177.     ANIMATION_COMMON_EVENT_ID = 9 # Common event ID for Notes for Animations
    178.     TILESET_COMMON_EVENT_ID = 10  # Common event ID for Notes for Tilesets
    179.     MAPINFO_COMMON_EVENT_ID = 11  # Common event ID for Notes for Maps
    180.     EVENT_COMMON_EVENT_ID = 12    # Common event ID for Notes for Events
    181.     NOTE_STRING_LF = "\n"         # Line feed char for extra long signle note
    182.     NOTE_DATA_LF = DELIMITER      # Line feed char for extra long note data
    183.     USE_WILD_MODE = true          # Allow WILD MODE to override values
    184.     #--------------------------------------------------------------------------
    185.     # ● Don't change this part
    186.     #--------------------------------------------------------------------------
    187.     raise "Separator before and between Notes must be different" if
    188.       SEPARATOR == DELIMITER
    189.     raise "Extra long note markers must tell common event and file apart" if
    190.       NOTE_LABEL_CHAR == NOTE_FILE_CHAR
    191.   end
    192. end
    193. #==============================================================================
    194. # ■ DataNoteCore
    195. #------------------------------------------------------------------------------
    196. #   Core Engine for Note Field Support.
    197. #==============================================================================
    198. module DataNoteCore
    199.   include SailCat::DataNoteCore_Config
    200.   #--------------------------------------------------------------------------
    201.   # ● Constants
    202.   #--------------------------------------------------------------------------
    203.   SEP_REGEX = /#{SEPARATOR}.+$/  # Don't change this
    204.   #--------------------------------------------------------------------------
    205.   # ● Cache for flat arrays
    206.   #--------------------------------------------------------------------------
    207.   $flat_array_cache = {}
    208.   #--------------------------------------------------------------------------
    209.   # ● Retrive note values
    210.   #--------------------------------------------------------------------------
    211.   def note
    212.     # If not initialized
    213.     if @note.nil?
    214.       # For common events, use command list
    215.       @note = split(get_command_note(list)) if self.is_a?(RPG::CommonEvent)
    216.       # For map events, use command list
    217.       @note = split(get_command_note(list)) if self.is_a?(Game_Event)
    218.       # For troop, use command list in first page
    219.       @note = split(get_command_note(pages[0].list)) if self.is_a?(RPG::Troop)
    220.       # For others, use description, in case of no description, use name
    221.       @note ||= has_description? ? split(@description) : split(@name)
    222.       # Analyze
    223.       analyze
    224.     end
    225.     # Retrieve the value
    226.     return @note
    227.   end
    228.   #--------------------------------------------------------------------------
    229.   # ● Set note (Runtime support)
    230.   #      note: New note
    231.   #--------------------------------------------------------------------------
    232.   def note=(note)
    233.     # Set new note
    234.     @note = note
    235.     # Reanalyze
    236.     analyze
    237.   end
    238.   #--------------------------------------------------------------------------
    239.   # ● Get/set the note value in general
    240.   #--------------------------------------------------------------------------
    241.   def method_missing(param_name, *args, &block)
    242.     return super unless respond_to?(param_name)
    243.     param_str = param_name.to_s.sub!(/^_/, "")
    244.     # Set
    245.     if param_str[-1] == 61
    246.       param_key = param_str.chop
    247.       self.class.send :define_method, param_name do |value|
    248.         set_note(param_key, value)
    249.       end
    250.       set_note(param_key, *args)
    251.     # Get
    252.     else
    253.       self.class.send :define_method, param_name do |value|
    254.         get_note(param_str, value)
    255.       end
    256.       return get_note(param_str, *args)
    257.     end
    258.   end
    259.   #--------------------------------------------------------------------------
    260.   # ● Method name validating
    261.   #--------------------------------------------------------------------------
    262.   def respond_to?(method_name, *)
    263.     method_name.to_s[/^_.+/].nil? ? super : true
    264.   end
    265.   #--------------------------------------------------------------------------
    266.   # ● Override in WILD MODE
    267.   #--------------------------------------------------------------------------
    268.   def define_wild_methods
    269.     return unless USE_WILD_MODE
    270.     v = instance_variables.select {|i| instance_variable_get(i).is_a?(Numeric)}
    271.     v.each do |i|
    272.       next if i == "@id"
    273.       var = i[1..-1]
    274.       get_method = var; wild_get = "_#{var}"
    275.       set_method = "#{var}="; wild_set = "_#{var}="
    276.       self.class.send :define_method, get_method do
    277.         send wild_get, instance_variable_get(i)
    278.       end
    279.       self.class.send :define_method, set_method do |value|
    280.         send wild_set, value
    281.         instance_variable_set(i, value)
    282.       end
    283.     end
    284.   end
    285.   #--------------------------------------------------------------------------
    286.   # ● Flat array
    287.   #--------------------------------------------------------------------------
    288.   def flat_array(param)
    289.     case param
    290.     when []
    291.       []
    292.     when Array
    293.       $flat_array_cache[param] ||= param.inject([]) {|a, e|
    294.         a.concat(flat_array(e))}
    295.     when Hash
    296.       flat_array(param.values)
    297.     when Range
    298.       param.entries
    299.     else
    300.       [param]
    301.     end
    302.   end
    303.   #--------------------------------------------------------------------------
    304.   # ● Check description (Private method)
    305.   #--------------------------------------------------------------------------
    306.   private
    307.   def has_description?
    308.     instance_variables.include?("@description")
    309.   end
    310.   #--------------------------------------------------------------------------
    311.   # ● Cut note from commands (Private method)
    312.   #--------------------------------------------------------------------------
    313.   def get_command_note(list)
    314.     for index in 0...list.length
    315.       break if list[index].code != 108 and list[index].code != 408
    316.     end
    317.     join_command_note(list[0...index], DELIMITER)
    318.   end
    319.   #--------------------------------------------------------------------------
    320.   # ● Join notes from commands (Private method)
    321.   #--------------------------------------------------------------------------
    322.   def join_command_note(list, linefeed)
    323.     (list.collect do |x|
    324.       case x.code
    325.       when 111
    326.         x.parameters[0] == 12 ? x.parameters[1] : ""
    327.       when 209
    328.         ((x.parameters[1].list.select do |c|
    329.           c.code == 45
    330.         end).map do |c|
    331.           c.parameters[0]
    332.         end).join(linefeed)
    333.       else
    334.         x.parameters[0]
    335.       end
    336.     end).join(linefeed)
    337.   end
    338.   #--------------------------------------------------------------------------
    339.   # ● Split key/value pairs (Private method)
    340.   #--------------------------------------------------------------------------
    341.   def split(text)
    342.     text.slice(SEP_REGEX).to_s
    343.   end
    344.   #--------------------------------------------------------------------------
    345.   # ● Get note value (Private method)
    346.   #--------------------------------------------------------------------------
    347.   def get_note(param_name, default = nil)
    348.     return default if self.note.empty? or not @note_set.include?(param_name)
    349.     value = @note_set[param_name].nil? ? default : @note_set[param_name]
    350.     value.is_a?(Proc) ? value.call($game_variables) : value
    351.   end
    352.   #--------------------------------------------------------------------------
    353.   # ● Set note value (Private method)
    354.   #--------------------------------------------------------------------------
    355.   def set_note(param_name, value)
    356.     @note_set ||= {}
    357.     @note_set[param_name] = value
    358.   end
    359.   #--------------------------------------------------------------------------
    360.   # ● Get value from label (Private method)
    361.   #--------------------------------------------------------------------------
    362.   def get_label(label, identifier, linefeed)
    363.     # Retrieve from cache if any
    364.     event_id = label.sub!(/^([0-9]+),/, "") ? $1.to_i : note_event_id
    365.     label = default_label(identifier) if label.empty?
    366.     $data_notes ||= {}
    367.     if $data_notes.has_key?([event_id, label])
    368.       return $data_notes[[event_id, label]]
    369.     end
    370.     # Initialize common event
    371.     $data_common_events ||= load_data("Data/CommonEvents.rxdata")
    372.     event = $data_common_events[event_id]
    373.     return "" if event.nil? or event.list.length == 1
    374.     # Find label
    375.     list = event.list
    376.     start_index = 0
    377.     end_index = list.length
    378.     for index in 0...list.length
    379.       next if list[index].code != 118
    380.       if list[index].parameters[0] == label
    381.         start_index = index + 1
    382.       elsif start_index > 0
    383.         break end_index = index
    384.       end
    385.     end
    386.     # Find note in commands
    387.     if start_index == 0
    388.       result = ""
    389.     else
    390.       cmds = list[start_index...end_index]
    391.       cmds.reject! do |x|
    392.         not [101, 401, 108, 408, 111, 209, 355, 655].include?(x.code)
    393.       end
    394.       result = join_command_note(cmds, linefeed)
    395.     end
    396.     $data_notes[[event_id, label]] = result
    397.   end
    398.   #--------------------------------------------------------------------------
    399.   # ● Get value from INI file (Private method)
    400.   #--------------------------------------------------------------------------
    401.   def read_ini_file(label)
    402.     return unless FileTest.exist?(NOTE_FILE)
    403.     # Initialize label
    404.     label = default_label(nil) if label.empty?
    405.     # Open INI file
    406.     File.open(NOTE_FILE, "r") do |f|
    407.       label_key = "[#{label}]\n"
    408.       found = false
    409.       # Loop for each line
    410.       f.each_line do |l|
    411.         # Continue for remarks
    412.         next if l[0] == ?; or l[0] == ?#
    413.         # Continue for wrong labels
    414.         next unless l == label_key or found
    415.         # Continue for the next line
    416.         (found = true; next) unless found
    417.         # Find Labels
    418.         break if l[0] == ?[
    419.         # Find key/value pair
    420.         pair = l.split("=", 2)
    421.         next if pair.size < 2
    422.         key = pair[0].strip
    423.         value = pair[1].strip
    424.         # Try parse value as number, if failed, as string
    425.         result = lambda{|v| eval(value) rescue value}
    426.         result = result.call($game_variables) unless value =~ /v\[|\$/
    427.         # Set the value
    428.         @note_set[key] = result
    429.       end
    430.     end
    431.   end
    432.   #--------------------------------------------------------------------------
    433.   # ● Get extra long notes' Event ID(Private method)
    434.   #--------------------------------------------------------------------------
    435.   def note_event_id
    436.     class_name = self.class.to_s[5..-1]
    437.     eval(class_name.upcase + "_COMMON_EVENT_ID") rescue 0
    438.   end
    439.   #--------------------------------------------------------------------------
    440.   # ● Get extra long notes' Label name(Private method)
    441.   #--------------------------------------------------------------------------
    442.   def default_label(id)
    443.     if self.is_a?(RPG::Event)
    444.       sprintf("%03d#%s%s", $game_map.map_id, self.name, id ? "_#{id}" : "")
    445.     else
    446.       self.name + (id ? "_#{id}" : "")
    447.     end
    448.   end
    449.   #--------------------------------------------------------------------------
    450.   # ● Analyze the note string (Single run for every object)
    451.   #--------------------------------------------------------------------------
    452.   def analyze
    453.     @note_set = {}
    454.     # When empty, returns nil
    455.     return if @note.nil? or @note.empty?
    456.     # When label, read from reference
    457.     if @note[1] == NOTE_LABEL_CHAR
    458.       @note = SEPARATOR + get_label(@note[2..-1], nil, NOTE_DATA_LF)
    459.     elsif @note[1] == NOTE_FILE_CHAR
    460.       read_ini_file(@note[2..-1])
    461.       return
    462.     end
    463.     # Split strings
    464.     param_regex = /^ *([A-Za-z0-9_]+)\b([+:=.\-]?(.*?))$/
    465.     # Delimit sections
    466.     note_array = @note[1..-1].gsub(/\\#{DELIMITER}/, "\001").split(DELIMITER)
    467.     note_array.each do |x|
    468.       result = nil
    469.       if x[param_regex]
    470.         param_name = $1
    471.         param_value = $2
    472.         param_exp = $3.gsub(/\001/, DELIMITER)
    473.         # Boolean (+)
    474.         if param_value.strip.empty? or param_value[0] == ?+
    475.           result = true
    476.         # Boolean (-)
    477.         elsif param_value[0] == ?-
    478.           result = false
    479.         # Numeric
    480.         elsif param_value[0] == ?=
    481.           result = lambda{|v| eval(param_exp) rescue nil}
    482.           result = result.call($game_variables) unless param_exp =~ /v\[|\$/
    483.         # String
    484.         elsif param_value[0] == ?:
    485.           result = param_exp
    486.         # Label
    487.         elsif param_value[0] == ?.
    488.           result = get_label(param_exp, param_name, NOTE_STRING_LF)
    489.         end
    490.         @note_set[param_name] = result
    491.       end
    492.     end
    493.   end
    494. end
    495. #==============================================================================
    496. # ■ RPG Module Inclusions
    497. #------------------------------------------------------------------------------
    498. #   Include this function for 14 RPG modules.
    499. #==============================================================================
    500. module RPG
    501.   [Actor, Class, Enemy, State, Animation, Tileset, MapInfo, Event].each do |c|
    502.     c.send :include, DataNoteCore
    503.     c.send :define_method, :name do
    504.       @name1 ||= (@name.sub(DataNoteCore::SEP_REGEX) {|s| ""}).strip
    505.     end
    506.     c.send :define_method, :name= do |value|
    507.       @name1 = value.strip
    508.       @name = @name1 + DataNoteCore::SEPARATOR + note
    509.     end
    510.     c.new.define_wild_methods unless c == RPG::Event
    511.   end
    512.   [Item, Skill, Weapon, Armor].each do |c|
    513.     c.send :include, DataNoteCore
    514.     c.send :define_method, :description do
    515.       @description1 ||= (@description.sub(DataNoteCore::SEP_REGEX) {|s|
    516.       ""}).strip
    517.     end
    518.     c.send :define_method, :description= do |value|
    519.       @description1 = value.strip
    520.       @description = @description1 + DataNoteCore::SEPARATOR + note
    521.     end
    522.     c.new.define_wild_methods
    523.   end
    524.   [Troop, CommonEvent].each do |c|
    525.     c.send :include, DataNoteCore
    526.   end
    527. end
    528. #==============================================================================
    529. # ■ Game_Event
    530. #------------------------------------------------------------------------------
    531. #   Include this function for Game Events (runtime map events).
    532. #==============================================================================
    533. class Game_Event
    534.   include DataNoteCore
    535. end
    复制代码




    本贴来自国际rpgmaker官方论坛作者:SailCat处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/add-note-support-for-xp-database.171601/
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    简体中文
    繁體中文
    English(英语)
    日本語(日语)
    Deutsch(德语)
    Русский язык(俄语)
    بالعربية(阿拉伯语)
    Türkçe(土耳其语)
    Português(葡萄牙语)
    ภาษาไทย(泰国语)
    한어(朝鲜语/韩语)
    Français(法语)
    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-8-4 12:50 , Processed in 0.110165 second(s), 52 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表