#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Resource Tester by Blizzard
# Version: 1.05b
# Type: Time-and-Space saving Utility
# Convert to module with method: DeadElf79 (23/02/2015)
# Write files only while $DEBUG is true!
# Date: 16.8.2007
# Date v1.0b: 17.8.2007
# Date v1.01b: 17.9.2007
# Date v1.02b: 27.3.2008
# Date v1.05b: 3.4.2008
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
# Compatibility:
#
# Compatible with anything, even the SDK 2.x (because it gets overriden).
# Will not search for script-required resources.
#
#
# Features:
#
# - finds all resources used in your game
# - incredible speed: searching trough a game with over 300 maps is a matter
# of just seconds
# - optional feature to list all actors, skills, weapons, armors, items,
# enemies, troops, states, animations, tilesets and common events that are
# never being used anywhere in the game and only log all the used data
#
# new in 1.0b:
# - fixed the typing mistake that would cause adding the skill with ID 1
# into the logged skills instead of the real skill when the script was
# processing a "Force Action" event command
# - rewritten conditions using classic syntax to avoid RGSS conditioning bug
# - now beta
#
# new in 1.01b:
# - fixed glitch where changing a Battle End ME would be logged as SE
# - improved coding
#
# new in 1.02b:
# - fixed bug caused by a typing mistake
#
# new in 1.05b:
# - fixed other potential bugs
#
#
# Explanation:
#
# This script will search through your database and your maps for resources
# that are being used. It will create a list of the resources used in your
# game.
#
#
# How to use:
#
# Put this script over all other scripts in the editor. Set the player\'s
# starting position and starting party. Set everything up as if you were
# about to set up the game to be playable and run your game once. Several
# text files will be created during that time. Now you can remove the script
# from the editor and open the text files. They will include lists of
# resources that your game uses, but the file names will not have extensions.
# Note that resources that are "hard-coded" into your scripts, cannot be
# located by this script.
#
#
# Configuration:
#
# Set up following constants to suit your needs:
#
# $deep_testing - When this value is false, the script will just iterate
# through your database and maps and find out which resources
# are being accessed. When this values is true, the script
# will find out which data isn\'t used first and then create a
# list of resources used by data that is being used. It will
# also create a file of which data isn\'t used. (i.e. a skill
# that no one uses in the entire game)
#
#
# How the script works:
#
# - when $deep_testing is false
#
# 1. The script will open all your maps and gather a list of all events. It
# will iterate through all the events\' codes and find resources that are
# being accessed (i.e. playing a sound, changing windowskin, etc.).
# 2. It will do the same with all common events and battle events.
# 3. It will open all actor, skill, weapon, armor, item, enemy, animations,
# tilesets and system data.
# 4. It will iterate through all of them and find all resources ever being
# accessed.
#
# - when $deep_testing is true
#
# 1. Your system data will be logged and the player\'s starting map ID will
# be accesssed. This map will be logged as "pending".
# -> logs audio FILES, graphic FILES from system and all actors
# 2. Pending maps are being accessed, their properties are being logged:
# -> logs new tilesets, troops, event pages and audio FILES
# Maps are logged as completed.
# 3. Pending troops will be checked:
# -> logs new enemies and battle events
# Troops are logged as completed.
# 4. Pending enemies will be checked:
# -> logs new skills, weapons, armors items, animations and
# battler FILES
# Enemies are logged as completed.
# 5. Pending actors will be checked:
# -> logs classes, weapons, armors, character FILES and battler FILES
# Actors are logged as completed.
# 6. Pending classes will be checked:
# -> logs new skills
# Classes are logged as completed.
# 7. Pending skills will be checked:
# -> logs new event pages, states, animations, icon FILES and
# audio FILES
# Skills are logged as completed.
# 8. Pending items will be checked:
# -> logs new event pages, states, animations, icon FILES and
# audio FILES
# Items are logged as completed.
# 9. Pending events are getting tested on following commands:
# - call common event -> logs new event pages
# - change items -> logs new items
# - change weapons -> logs new weapons
# - change armors -> logs new armors
# - change party members -> logs new actors and classes
# - change windowskin -> logs new windowskin FILES
# - change battle audio -> logs new audio FILES
# - transfer player -> logs new maps
# - change map settings -> logs new panorama/fog/battleback FILES
# - show animation -> logs new animations
# - move event -> logs new character FILES
# - execute transition -> logs new transition FILES
# - show picture -> logs new picture FILES
# - play any audio file -> logs new audio FILES
# - battle processing -> logs new troops
# - shop processing -> logs new weapons, armors and items
# - name processing -> logs new actors and classes
# - change actor state -> logs new actors, classes and states
# - change actor skill -> logs new actors, classes and skills
# - change actor class -> logs new actors and classes
# - change actor graphic -> logs new actors, classes and character FILES
# - change enemy state -> logs new stantes
# - enemy transform -> logs new enemies
# - show battle animation -> logs new animations
# - force action -> logs new skills
# Also logs new character FILES if the page is a normal event page.
# Common Events are logged as completed.
# 10. Returns to step 2 if there are any pending maps, troops, enemies,
# actors, classes, skills, items, or event pages.
# 11. Pending weapons will be checked:
# -> logs new states, animations and icon FILES
# 12. Pending armors will be checked:
# -> logs new states and icon FILES
# 13. Pending states and zero-hp states will be checked:
# -> logs new states and animations
# 14. Pending animations will be checked:
# -> logs new animation FILES and audio FILES
# 15. Pending tilesets will be checked:
# -> logs new tileset FILES, autotile FILES, panorama FILES, fog FILES
# and battleback FILES
# 16. Saves a list of resources and saves a list of unused actors, classes,
# skills, weapons, armors, items, enemies, troops, states, animations,
# tilesets, common events and maps.
#
#
# Final Notes:
#
# - If you use a system where you have more than one start location for the
# game (i.e. a separated mode with a different storyline) and want to turn
# $deep_testing on during the testing, then just put in the starting map a
# dummy event with teleport commands to the starting maps of the other game
# modes.
#
# - If you are using $deep_testing, be careful, since teleport commands that
# use a variable to determine the new map ID can\'t be tested. Do as you
# would with with different game modes: Create dummy events.
#
# - Auto-start and parallel process common events will be automatically logged
# from the beginning.
#
# - The best moment to use this script is just before you are going to compile
# and encrypt the game data. If you want to use it for resource cleaning,
# turn off $deep_testing.
#
#
# If you find any bugs, please report them here:
# http://forum.chaos-project.com
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
$deep_testing = false
#==============================================================================
# Main
#==============================================================================
module Blizzard
def self.Resource_Test
time = Time.now
_actors = load_data(\'Data/Actors.rxdata\')
_classes = load_data(\'Data/Classes.rxdata\')
_skills = load_data(\'Data/Skills.rxdata\')
_items = load_data(\'Data/Items.rxdata\')
_weapons = load_data(\'Data/Weapons.rxdata\')
_armors = load_data(\'Data/Armors.rxdata\')
_enemies = load_data(\'Data/Enemies.rxdata\')
_states = load_data(\'Data/States.rxdata\')
_animations = load_data(\'Data/Animations.rxdata\')
_tilesets = load_data(\'Data/Tilesets.rxdata\')
_pages = load_data(\'Data/CommonEvents.rxdata\')
_troops = load_data(\'Data/Troops.rxdata\')
_maps = load_data(\'Data/MapInfos.rxdata\')
_system = load_data(\'Data/System.rxdata\')
bgm, bgs, se, me, animations, autotiles, battlebacks, battlers, characters,
fogs, gameovers, icons, panoramas, pictures, tilesets, titles, transitions,
windowskins = [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [],
[], []
windowskins.push(_system.windowskin_name)
titles.push(_system.title_name)
gameovers.push(_system.gameover_name)
transitions.push(_system.battle_transition)
bgm.push(_system.title_bgm.name)
me.push(_system.battle_end_me.name, _system.gameover_me.name)
se.push(_system.cursor_se.name, _system.decision_se.name,
_system.cancel_se.name, _system.buzzer_se.name,
_system.equip_se.name, _system.shop_se.name, _system.save_se.name,
_system.load_se.name, _system.battle_start_se.name,
_system.escape_se.name, _system.actor_collapse_se.name,
_system.enemy_collapse_se.name)
if $deep_testing
p_maps, p_troops, p_enemies, p_actors, p_classes, p_skills, p_items,
p_pages, p_weapons, p_armors, p_states, p_animations, p_tilesets, c_maps,
c_troops, c_enemies, c_actors, c_classes, c_skills, c_items, c_pages =
[_system.start_map_id], [], [], _system.party_members.clone, [], [], [],
[], [], [], [], [], [], [], [], [], [], [], [], [], []
(_pages - [nil]).each {|page|
if [1, 2].include?(page.trigger)
p_pages.push(page)
c_pages.push(page.id)
end}
p_maps.delete(0)
raise \'Error! There is no start map defined!\' if p_maps.size == 0
loop do
Graphics.update
p_maps.clone.each {|id|
map = load_data(sprintf("Data/Map%03d.rxdata", id))
map.events.values.each {|i| p_pages += i.pages}
p_tilesets.push(map.tileset_id)
map.encounter_list.each {|i|
p_troops.push(i) unless (c_troops | p_troops).include?(i)}
bgm.push(map.bgm.name) if map.autoplay_bgm
bgs.push(map.bgs.name) if map.autoplay_bgs
c_maps.push(p_maps.shift)}
p_troops.clone.each {|id|
p_pages += _troops[id].pages
_troops[id].members.each {|member|
unless (c_enemies | p_enemies).include?(member.enemy_id)
p_enemies.push(member.enemy_id)
end}
c_troops.push(p_troops.shift)}
p_enemies.clone.each {|id|
_enemies[id].actions.each {|i|
unless (c_skills | p_skills).include?(i.skill_id)
p_skills.push(i.skill_id)
end}
if _enemies[id].treasure_prob > 0
if _enemies[id].item_id > 0
unless (c_items | p_items).include?(_enemies[id].item_id)
p_items.push(_enemies[id].item_id)
end
elsif _enemies[id].weapon_id > 0
unless p_weapons.include?(_enemies[id].weapon_id)
p_weapons.push(_enemies[id].weapon_id)
end
elsif _enemies[id].armor_id > 0
unless p_armors.include?(_enemies[id].armor_id)
p_armors.push(_enemies[id].armor_id)
end
end
end
[_enemies[id].animation1_id, _enemies[id].animation2_id].each {|i|
p_animations.push(i) unless i == 0 || p_animations.include?(i)}
battlers.push(_enemies[id].battler_name)
c_enemies.push(p_enemies.shift)}
p_actors.clone.each {|id|
actor = _actors[id]
unless _actors[id].weapon_id == 0 || p_weapons.include?(_actors[id].weapon_id)
p_weapons.push(_actors[id].weapon_id)
end
[_actors[id].armor1_id, _actors[id].armor2_id,
_actors[id].armor3_id, _actors[id].armor4_id].each {|i|
p_armors.push(i) unless i == 0 || p_armors.include?(i)}
unless (c_classes | p_classes).include?(_actors[id].class_id)
p_classes.push(_actors[id].class_id)
end
characters.push(_actors[id].character_name)
battlers.push(_actors[id].battler_name)
c_actors.push(p_actors.shift)}
p_classes.clone.each {|id|
_classes[id].learnings.each {|i|
unless (c_skills | p_skills).include?(i.skill_id)
p_skills.push(i.skill_id)
end}
c_classes.push(p_classes.shift)}
p_skills.clone.each {|id|
unless _skills[id].common_event_id == 0 ||
c_pages.include?(_skills[id].common_event_id)
p_pages.push(_pages[_skills[id].common_event_id])
c_pages.push(_skills[id].common_event_id)
end
_skills[id].plus_state_set.each {|i|
p_states.push(i) unless p_states.include?(i)}
[_skills[id].animation1_id, _skills[id].animation2_id].each {|i|
p_animations.push(i) unless i == 0 || p_animations.include?(i)}
icons.push(_skills[id].icon_name)
se.push(_skills[id].menu_se.name)
c_skills.push(p_skills.shift)}
p_items.clone.each {|id|
unless _items[id].common_event_id == 0 ||
c_pages.include?(_items[id].common_event_id)
p_pages.push(_pages[_items[id].common_event_id])
c_pages.push(_items[id].common_event_id)
end
_items[id].plus_state_set.each {|i|
p_states.push(i) unless p_states.include?(i)}
[_items[id].animation1_id, _items[id].animation2_id].each {|i|
p_animations.push(i) unless i == 0 || p_animations.include?(i)}
icons.push(_items[id].icon_name)
se.push(_items[id].menu_se.name)
c_items.push(p_items.shift)}
p_pages.clone.each {|page|
characters.push(page.graphic.character_name) if page.is_a?(RPG::Event::Page)
page.list.each {|command|
case command.code
when 117
p_pages.push(_pages[command.parameters[0]])
c_pages.push(command.parameters[0])
when 126
if command.parameters[1] == 0 && command.parameters[2] == 0 &&
!(c_items | p_items).include?(command.parameters[0])
p_items.push(command.parameters[0])
end
when 127
if command.parameters[1] == 0 && command.parameters[2] == 0 &&
!p_weapons.include?(command.parameters[0])
p_weapons.push(command.parameters[0])
end
when 128
if command.parameters[1] == 0 && command.parameters[2] == 0 &&
!p_armors.include?(command.parameters[0])
p_armors.push(command.parameters[0])
end
when 129
if command.parameters[1] == 0 &&
!(c_actors | p_actors).include?(command.parameters[0])
p_actors.push(command.parameters[0])
end
when 131 then windowskins.push(command.parameters[0])
when 132 then bgm.push(command.parameters[0].name)
when 133 then me.push(command.parameters[0].name)
when 201
if command.parameters[0] == 0 &&
!(c_maps | p_maps).include?(command.parameters[1])
p_maps.push(command.parameters[1])
end
when 204
case command.parameters[0]
when 0 then panoramas.push(command.parameters[1])
when 1 then fogs.push(command.parameters[1])
when 2 then battlebacks.push(command.parameters[1])
end
when 207
unless p_animations.include?(command.parameters[1])
p_animations.push(command.parameters[1])
end
when 209
command.parameters[1].list.each {|move|
characters.push(move.parameters[0]) if move.code == 41}
when 222 then transitions.push(command.parameters[0])
when 231 then pictures.push(command.parameters[1])
when 241 then bgm.push(command.parameters[0].name)
when 245 then bgs.push(command.parameters[0].name)
when 249 then me.push(command.parameters[0].name)
when 250 then se.push(command.parameters[0].name)
when 301
unless c_troops.include?(command.parameters[0])
p_troops.push(command.parameters[0])
end
when 302
goods = [command.parameters]
index = page.list.index(command)
loop do
index += 1
if page.list[index].code == 605
goods.push(page.list[index].parameters)
else
break
end
end
goods.each {|good|
case good[0]
when 0
unless (c_items | p_items).include?(good[1])
p_items.push(good[1])
end
when 1
p_weapons.push(good[1]) unless p_weapons.include?(good[1])
when 2
p_armors.push(good[1]) unless p_armors.include?(good[1])
end}
when 303
unless (c_actors | p_actors).include?(command.parameters[0])
p_actors.push(command.parameters[0])
end
when 313
if command.parameters[1] == 0 &&
!p_states.include?(command.parameters[2])
p_states.push(command.parameters[2])
end
when 318
unless (c_actors | p_actors).include?(command.parameters[0])
p_actors.push(command.parameters[0])
end
if command.parameters[1] == 0 &&
!(c_skills | p_skills).include?(command.parameters[2])
p_skills.push(command.parameters[2])
end
when 321
unless (c_actors | p_actors).include?(command.parameters[0])
p_actors.push(command.parameters[0])
end
unless (c_classes | p_classes).include?(command.parameters[1])
p_classes.push(command.parameters[1])
end
when 322
unless (c_actors | p_actors).include?(command.parameters[0])
p_actors.push(command.parameters[0])
end
characters.push(command.parameters[1])
battlers.push(command.parameters[3])
when 333
if command.parameters[1] == 0 &&
!p_states.include?(command.parameters[2])
p_states.push(command.parameters[2])
end
when 336
unless (c_enemies | p_enemies).include?(command.parameters[1])
p_enemies.push(command.parameters[1])
end
when 337
unless p_animations.include?(command.parameters[2])
p_animations.push(command.parameters[2])
end
when 339
if command.parameters[2] != 0 &&
!(c_skills | p_skills).include?(command.parameters[3])
p_skills.push(command.parameters[3])
end
end}
p_pages.shift}
all = [p_maps, p_troops, p_enemies, p_actors, p_classes, p_skills,
p_items, p_pages]
break if all.all? {|ary| ary.size == 0}
end
p_weapons.each {|id|
_weapons[id].plus_state_set.each {|i|
p_states.push(i) unless p_states.include?(i)}
[_weapons[id].animation1_id, _weapons[id].animation2_id].each {|i|
p_animations.push(i) unless i == 0 || p_animations.include?(i)}
icons.push(_weapons[id].icon_name)}
p_armors.each {|id|
unless _armors[id].auto_state_id == 0 ||
p_states.include?(_armors[id].auto_state_id)
p_states.push(_armors[id].auto_state_id)
end
icons.push(_armors[id].icon_name)}
(_states - [nil]).each {|s|
p_states.push(s.id) if s.zero_hp && !p_states.include?(s.id)}
size = 0
while size != p_states.size
size = p_states.size
p_states.clone.each {|id| _states[id].plus_state_set.each {|i|
p_states.push(i) unless p_states.include?(i)}}
end
p_states.each {|id|
unless _states[id].animation_id == 0 ||
p_animations.include?(_states[id].animation_id)
p_animations.push(_states[id].animation_id)
end}
p_animations.each {|id|
animations.push(_animations[id].animation_name)
_animations[id].timings.each {|timing| se.push(timing.se.name)}}
p_tilesets.each {|id|
tilesets.push(_tilesets[id].tileset_name)
fogs.push(_tilesets[id].fog_name)
panoramas.push(_tilesets[id].panorama_name)
battlebacks.push(_tilesets[id].battleback_name)
(0..6).each {|i| autotiles.push(_tilesets[id].autotile_names[i])}}
all = [[_maps, _maps.keys - c_maps],
[_troops, (1..._troops.size).to_a - c_troops],
[_enemies, (1..._enemies.size).to_a - c_enemies],
[_actors, (1..._actors.size).to_a - c_actors],
[_classes, (1..._classes.size).to_a - c_classes],
[_skills, (1..._skills.size).to_a - c_skills],
[_items, (1..._items.size).to_a - c_items],
[_pages, (1..._pages.size).to_a - c_pages],
[_weapons, (1..._weapons.size).to_a - p_weapons],
[_armors, (1..._armors.size).to_a - p_armors],
[_states, (1..._states.size).to_a - p_states],
[_animations, (1..._animations.size).to_a - p_animations],
[_tilesets, (1..._tilesets.size).to_a - p_tilesets]]
if $DEBUG
datas = [\'Maps\', \'Troops\', \'Enemies\', \'Actors\', \'Classes\', \'Skills\',
\'Items\', \'Common Events\', \'Weapons\', \'Armors\', \'States\',
\'Animations\', \'Tilesets\']
file = File.open(\'Unused.txt\', \'wb\')
datas.each_index {|i|
file.write("\\r\\n --::>> Unused #{datas[i]} <<::--\\r\\n\\r\\n")
(all[i][1] | all[i][1]).each {|one|
file.write("#{sprintf(\'%03d\', one)} : #{all[i][0][one].name}\\r\\n")}
file.write("\\r\\n")}
end
else
(_actors - [nil]).each {|actor|
characters.push(actor.character_name)
battlers.push(actor.battler_name)}
(_skills + _items - [nil]).each {|object|
icons.push(object.icon_name)
se.push(object.menu_se.name)}
(_weapons + _armors - [nil]).each {|object| icons.push(object.icon_name)}
(_enemies - [nil]).each {|enemy| battlers.push(enemy.battler_name)}
(_animations - [nil]).each {|animation|
animations.push(animation.animation_name)
animation.timings.each {|timing| se.push(timing.se.name)}}
(_tilesets - [nil]).each {|tileset|
tilesets.push(tileset.tileset_name)
fogs.push(tileset.fog_name)
panoramas.push(tileset.panorama_name)
battlebacks.push(tileset.battleback_name)
(0..6).each {|i| autotiles.push(tileset.autotile_names[i])}}
(_troops - [nil]).each {|troop| _pages += troop.pages}
_keys = _maps.keys
_keys.each_index {|i|
Graphics.update if i % 20 == 0
events = load_data(sprintf("Data/Map%03d.rxdata", _keys[i])).events
events.values.each {|event| _pages += event.pages}}
_pages -= [nil]
_pages.each_index {|i|
Graphics.update if i % 100 == 0
if _pages[i].is_a?(RPG::Event::Page)
characters.push(_pages[i].graphic.character_name)
end
_pages[i].list.each {|command|
case command.code
when 131 then windowskins.push(command.parameters[0])
when 132 then bgm.push(command.parameters[0].name)
when 133 then se.push(command.parameters[0].name)
when 204
case command.parameters[0]
when 0 then panoramas.push(command.parameters[1])
when 1 then fogs.push(command.parameters[1])
when 2 then battlebacks.push(command.parameters[1])
end
when 209
command.parameters[1].list.each {|move|
characters.push(move.parameters[0]) if move.code == 41}
when 222 then transitions.push(command.parameters[0])
when 231 then pictures.push(command.parameters[1])
when 241 then bgm.push(command.parameters[0].name)
when 245 then bgs.push(command.parameters[0].name)
when 249 then me.push(command.parameters[0].name)
when 250 then se.push(command.parameters[0].name)
when 322
characters.push(command.parameters[1])
battlers.push(command.parameters[3])
end}}
end
if $DEBUG
folders = [\'Audio/BGM\', \'Audio/BGS\', \'Audio/ME\', \'Audio/SE\', \'Animations\',
\'Autotiles\', \'Battlebacks\', \'Battlers\', \'Characters\', \'Fogs\',
\'Gameovers\', \'Icons\', \'Panoramas\', \'Pictures\', \'Tilesets\',
\'Titles\', \'Transitions\', \'Windowskins\']
all = [bgm, bgs, me, se, animations, autotiles, battlebacks, battlers,
characters, fogs, gameovers, icons, panoramas, pictures, tilesets,
titles, transitions, windowskins]
all.each {|ary| ary.delete(\'\'); ary.sort!}
file = File.open(\'Tested Resources.txt\', \'wb\')
folders.each_index {|i|
file.write("\\r\\n ---::{ #{folders[i]} }::---\\r\\n\\r\\n")
(all[i] | all[i]).each {|one| file.write("#{folders[i]}/#{one}\\r\\n")}
file.write("\\r\\n")}
file.close
end
rescue Errno::ENOENT
filename = $!.message.sub(\'No such file or directory - \', \'\')
print("File -- #{filename} -- is missing.")
end
end