View difference between Paste ID: 5VBFgVRm and rJmGELa8
SHOW: | | - or go back to the newest paste.
1
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
2
# Clean Custom DB and Party Inventory Cleaner
3
# Author: Eshra
4
# First Version: 13 Dec. 2012 
5
# Compatibility: RPG Maker VX Ace
6
# Dependencies: 
7
#     1. Tsuki_CustomDataManager
8
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
9
# * This script is meant to be used with the upgradable equipment script or the
10
#   Unique Items script
11
#
12
# Custom Database and Default Database are now managed properly, before
13
# items were not being removed from it properly and so strange things such
14
# as items disappearing, or new items could seemingly magically appear in
15
# your inventory. It was a result of the ids in the parties inventory
16
# no longer matching with the ids of the items (b/c database was changed).
17
#
18
# The Upg Equip Script did not work properly when saving and reloading a file in 
19
# which actors had upgraded/unique item equipped, this is now fixed. The item 
20
# would seem to disappear.
21
# 
22
# This script provides a method call to be used internally to fix those issues.
23
#------------------------------------------------------------------------------
24
# Update Log
25
# 13 Dec 2012 - Init Release
26
#------------------------------------------------------------------------------
27
($imported||={})["Ra CleanCDB"] = true
28
raise "CCDBPI Requires Tsuki Custom DM" if !$imported["Tsuki_CustomDataManager"]
29
raise "CCDBPI Requires Snippet" if !$imported["Ra Store DB Arr Sizes"]
30
31
32
#==============================================================================
33
# ** Game_Party
34
#==============================================================================
35
class Game_Party < Game_Unit
36
  def get_item_era; @items; end
37
  def get_armors_era; @armors; end
38
  def get_weapons_era; @weapons; end
39
end
40
#==============================================================================
41
# * Game_Actor
42
#==============================================================================
43
class Game_Actor < Game_Battler
44
 def get_equips_era; @equips; end
45
end
46
#==============================================================================
47
# * Game_Actors
48
#==============================================================================
49
class Game_Actors 
50
  attr_reader :data
51
end
52
#==============================================================================
53
# * RPG::BaseItem
54
#==============================================================================
55
class RPG::BaseItem
56
  def set_id_era(nid); @id = nid; end
57
end
58
#==============================================================================
59
# * Game_BaseItem
60
#==============================================================================
61
class Game_BaseItem
62
  attr_accessor :item_id
63
  def item_class_era; @class;  end
64
end
65
#==============================================================================
66
# * Era
67
#==============================================================================
68
module Era
69
  module CleanCDB
70
    #--------------------------------------------------------------------------
71
    # * Clean up the custom db and normal db
72
    #-------------------------------------------------------------------------- 
73
    def self.clean
74
      init_vals
75
      store_all_inv_items
76
      double_check_nils # Double check all nils have been handled
77
    end
78
    #--------------------------------------------------------------------------
79
    # * Remove any nil value not at pos 0
80
    #--------------------------------------------------------------------------
81
    def self.double_check_nils
82
      dw,da,di = $data_weapons, $data_armors, $data_items
83
      dw.each_with_index{ |w,i| dw.delete_at(i) if w.nil? && i > 0}
84
      da.each_with_index{ |a,i| dw.delete_at(i) if a.nil? && i > 0}
85
      di.each_with_index{ |it,i| dw.delete_at(i) if it.nil? && i > 0}
86
    end
87
    #--------------------------------------------------------------------------
88
    # * Main routine for swapping around id values
89
    #-------------------------------------------------------------------------- 
90
    def self.store_all_inv_items
91
      
92
      org_wep_size = Era.db_array_size(:data_weapons)
93
      org_arm_size = Era.db_array_size(:data_armors)
94
      org_item_size = Era.db_array_size(:data_items)
95
      
96
      wep_size, arm_size = $data_weapons.size, $data_armors.size
97
      item_size = $data_items.size
98
99
      @weps = keep_cust_itm(org_wep_size, wep_size, $data_weapons)
100
      @arms = keep_cust_itm(org_arm_size, arm_size, $data_armors)
101
      @items = keep_cust_itm(org_item_size, item_size, $data_items)
102
      
103
      store_meta_equips # must store before clearing customs
104
      
105
      # now clean the custom db and the db and put the kept items back in one by
106
      # one while updating the parties inventory hashes at the same time.
107
      new_data_weps = Array.new(org_wep_size)
108
      new_data_arms = Array.new(org_arm_size)
109
      new_data_items = Array.new(org_item_size)
110
      
111
      $data_weapons = chop_db_arr(org_wep_size, $data_weapons)
112
      $data_armors = chop_db_arr(org_arm_size, $data_armors)
113
      $data_items = chop_db_arr(org_item_size, $data_items)
114
      
115
      # clean up the db
116
      $custom_weapons = []; $custom_armors = []; $custom_items = [];
117
      new_item_vals(@weps, $data_weapons, $custom_weapons, org_wep_size)
118
      new_item_vals(@arms, $data_armors, $custom_armors, org_arm_size)
119
      new_item_vals(@items, $data_items, $custom_items, org_item_size)
120
    end # store_all_inv_items
121
    #--------------------------------------------------------------------------
122
    # * Store Meta data about equips
123
    #--------------------------------------------------------------------------
124
    def self.store_meta_equips
125
      party = $game_party
126
      # Store metadata data about equipped items. 
127
      unqs = $imported["Ra Custom DM add-on"]
128
      upgs = $imported["Ra Upgradable Equipment"]
129
      
130
      $game_actors.data.each do |actor|
131
        next if !actor
132
        actor.get_equips_era.each do |e|
133
          next if !e
134
          item_class = e.item_class_era
135-
          unis = 
135+
136
            item = $data_weapons[id = e.item_id]
137
            @weps[id] = [item, 0, :EQUIPPED] if (unqs&&item.is_unique_rpgbi) || 
138
              (upgs && item.is_upg_dupe)
139
          elsif item_class == RPG::Armor
140
            item = $data_armors[id = e.item_id] 
141
            @arms[id] = [item, 0, :EQUIPPED]  if (unqs&&item.is_unique_rpgbi) || 
142
              (upgs && item.is_upg_dupe)
143
          elsif item_class == RPG::Item
144
            item = $data_items[id = e.item_id]
145
            @items[id] = [item, 0, :EQUIPPED]  if (unqs&&item.is_unique_rpgbi)|| 
146
              (upgs && item.is_upg_dupe)
147
          end
148
        end # actor.get_equips_era.each
149
      end # $game_actors.data.each
150
    end # store_meta_equips
151
    #--------------------------------------------------------------------------
152
    # * New Item IDs
153
    # sets new ids for items that were kept when cleaning out the database
154
    # param: metadata is the inclusion information, hashes item.id => array
155
    #        struct is the db array
156
    #        cust is the associated custom db array 
157
    #        curr_len is the original length of the db array
158
    #--------------------------------------------------------------------------
159
    def self.new_item_vals(metadata, struct, cust, curr_len)
160
      party = $game_party
161
      metadata.keys.each do |id|
162
        md_item = metadata[id][0]
163
        
164
        # not using lose item
165
        container = party.item_container(md_item.class)
166
        container.delete(md_item.id) unless metadata[id][2] == :EQUIPPED
167
        
168
        md_item.set_id_era(curr_len)
169
        struct.push(md_item)
170
        cust.push(md_item)
171
        
172
        # not using gain item
173
        equipped = metadata[id][2] == :EQUIPPED && metadata[id][1] == 0
174
        container[md_item.id] = metadata[id][1] unless equipped
175
        update_equip_ids(md_item.class, id, curr_len)
176
        
177
        @id_mod_log.push("#{md_item.class} #{md_item.name} #{id} -> #{md_item.id}")
178
        curr_len+=1
179
      end
180
    end
181
    
182
    #--------------------------------------------------------------------------
183
    # * Scan through all equipped items and update the ids of those items with 
184
    #     the corresponding new ids.
185
    #--------------------------------------------------------------------------
186
    def self.update_equip_ids(item_class, oid, new_id)
187
      $game_actors.data.each do |a|
188
        next if !a
189
        a.get_equips_era.each do |e| 
190
          
191
          next if !e
192
          e.item_id=new_id if e.item_id==oid && e.item_class_era==item_class
193
        end
194
      end
195
    end
196
    #--------------------------------------------------------------------------
197
    # * Chop off part of an array
198
    #-------------------------------------------------------------------------- 
199
    def self.chop_db_arr(keep_amt, struct)
200
      new_data = Array.new(keep_amt)
201
      0.upto(keep_amt-1){ |i| new_data[i] = struct[i] }
202
      new_data
203
    end
204
    #--------------------------------------------------------------------------
205
    # * Store the custom items that need to be re placed in the custom db arrays
206
    #   after cleaning.
207
    #--------------------------------------------------------------------------
208
    def self.keep_cust_itm(start, fin, struct_pass)
209
      party = $game_party
210
      inclusion_hash = {} # items that will be included in db after cleaning.
211
      start.upto(fin).each do |i|
212
        if (amt=party.item_number(struct_pass[i])) > 0
213
          inclusion_hash[struct_pass[i].id] = [struct_pass[i], amt]
214
        end
215
      end
216
      inclusion_hash
217
    end
218
    #--------------------------------------------------------------------------
219
    # * Initialization
220
    #--------------------------------------------------------------------------
221
    def self.init_vals
222
      @id_mod_log ||= []
223
      @organized_items = {}
224
    end
225
  end # CleanCDB
226
end # Era
227
228
# End of File