Sonic Colors: Ultimate/Development Leftovers
This is a sub-page of Sonic Colors: Ultimate.
Somehow, Blind Squirrel accidentally left in a ton of development assets from both the original game and Ultimate, which were discovered mere hours after release. They were eventually removed in v1.04.
Contents
- 1 Sound Headers and Metadata
- 2 Perforce Cache Log
- 3 Godot Project File
- 4 Sonic2010 Directory
- 4.1 _sonic2010.ini.lua
- 4.2 dvd_builder_image Directory
- 4.3 Development Tools
- 4.3.1 AnimationBindConverter/AnimationBindConverter.exe
- 4.3.2 arcview.bat
- 4.3.3 ArtworksCopy.vbs
- 4.3.4 BBATool.exe
- 4.3.5 binarc.exe
- 4.3.6 CircuitListCnv.exe
- 4.3.7 cri/
- 4.3.8 CriCsvConverter.exe
- 4.3.9 darch.exe
- 4.3.10 DistortionConv.exe
- 4.3.11 EventConv.exe
- 4.3.12 FogConv.exe
- 4.3.13 FlowExListCnv/FlowExListCnv.exe
- 4.3.14 FlowListCnv/FlowListCnv.exe
- 4.3.15 fontcvtr/
- 4.3.16 GetRevision/GetRevision.bat
- 4.3.17 GetRevision/Revision.h.template
- 4.3.18 GismoConverter/GismoConveter.exe
- 4.3.19 GismoBinaryMaker.exe
- 4.3.20 glarecnv.exe
- 4.3.21 GrassConv.exe
- 4.3.22 HintConv.exe
- 4.3.23 hnd2collision.exe
- 4.3.24 LightFieldConv.exe
- 4.3.25 LocalLightConv.exe
- 4.3.26 MakeStageToken.exe
- 4.3.27 MiiDataImport/
- 4.3.28 nw4r_matimport/nw4r_matimport.exe
- 4.3.29 nw4r_matimport/readme.txt
- 4.3.30 nw4r_matimport/run.bat
- 4.3.31 nw4r_texinfo.exe
- 4.3.32 nw4r_texmipmap/nw4r_texmipmap.exe
- 4.3.33 nw4r_texmipmap/readme.txt
- 4.3.34 nw4r_texmipmap/run.bat
- 4.3.35 PathConverter.exe
- 4.3.36 PathPhysXConverter.exe
- 4.3.37 PlayerPosition/player_position_wii.exe
- 4.3.38 setcvtr.exe
- 4.3.39 SetParticleListCnv.exe
- 4.3.40 SetSoundListCnv.exe
- 4.3.41 SoundCurveCnv.exe
- 4.3.42 StaffConv.exe
- 4.3.43 StgMapConverter.exe
- 4.3.44 TexConv.exe
- 4.3.45 xTextViewer/xTextViewer.exe
Sound Headers and Metadata
The Nintendo Switch version left all source header and metadata files for each compiled CriWare sound file in sound\all\SWITCH in the SwitchCriPak file.
Download Sonic Colors: Ultimate (Nintendo Switch) source CriWare sound files
File: SonicColorsUltimate_NX_SoundSRCFiles.zip (140 KB) (info)
|
Perforce Cache Log
The Nintendo Switch version left a cache log from an internal Perforce depot titled cached_perforce.txt in the root of the archived game content, it's over 2MB big!
Download Sonic Colors: Ultimate (Nintendo Switch) Perforce Cache Log
File: SonicColorsUltimate_P4CacheLog.zip (140 KB) (info)
|
Godot Project File
To do: Document exposed Godot data. |
The game's archives contain project data for Godot, allowing you to import game data into the editor and view stages.
Sonic2010 Directory
An incomplete directory titled Sonic2010 is present, with a lot of development content and source files from the original Wii title.
_sonic2010.ini.lua
-- 行頭にハイフンが2つあるのは、コメントです。 configurations = { -- システム system = { -- 起動設定 ini_state = "menu", stage = "stg110", event = "ev000", -- lang = "j", -- 本体言語 "j","e","g","f","s","i", "n" n=オランダ語(ストラップとかHBMとかチェック用) -- region = "jp", -- 本体リージョン "jp","us","eu" -- opt_lang = "j", -- オプション言語 "j","e","g","f","s","i", -- cri_load_log = true, -- trueの場合、CRI用、ロード最適化ログを出力します。 -- event_cp_dir = "%SONIC2010_ROOT%/Sonic2010/artworks/event/capture", -- イベント用キャプチャーディレクトリの指定 -- 描画設定 -- debugdraw_enable = false, -- false の場合、デバッグ描画を切ります。 -- shooting_mode = true, -- true の場合、画面撮影用の動作に切り替わります. -- ペリフェラル設定 freecamera_port = 1, -- フリーカメラのポート番号 -- device_old_check = true, -- 従来のWiiコン優先形式 -- リソース関連設定 -- reload_pathdata = true, -- true の場合、パスデータを mcs 経由でロードします。 -- read_setdata_xml = false, -- false の場合、セットデータを強制的にバイナリモードでロードします。 -- enable_allPhantom = true, -- true の場合、全ステージで全ファントムをロードします。 -- reload_wm_am_config = true, -- true の場合、ワールドマップ、エリアマップの設定ファイルを mcs 経由でロードします。 -- UseMii = true, -- trueの場合、マルチプレイでMiiを使用します。 -- UseSuperSonic = true, -- trueの場合、スーパーソニックを使用します。 }, }
dvd_builder_image Directory
The directory has a few scripts, while the other sonic2010 directory contains uncompressed mostly identical assets from the final game.
copy_largedata.bat
A script to copy cutscene movies.
@if not exist ..\dvd\movie md ..\dvd\movie xcopy /d /y \\muse\Project\Sonic_x2\Sonic2010\work\dvd\movie\*.sfd ..\dvd\movie @if exist .\sonic2010\movie\*.sfd del .\sonic2010\movie\*.sfd @if exist ..\dvd\movie\opening.sfd del ..\dvd\movie\opening.sfd pause
cri_load_log.txt
#CRIFS,77,,Begin,START_UP #CRIFS,85,0,Load,strap/strap_j.arc,0,50056,sonic2010_0.cpk,837058560,0 #CRIFS,185,0,Load,hbm/hbm_j.arc,0,463796,sonic2010_0.cpk,27785216,0 #CRIFS,198,0,Load,font.brfnt,0,496592,sonic2010_0.cpk,15863808,0 #CRIFS,544,0,Load,sonic2010/RVL_DefaultDO.sel,0,7456,Standard,0,0 #CRIFS,558,0,Load,hbm_module.rso,0,132872,sonic2010_0.cpk,16361472,0 #CRIFS,571,0,Load,save_banner.arc,0,26600,sonic2010_0.cpk,24279040,0 #CRIFS,585,0,Load,actstgmission.lua,0,6076,sonic2010_0.cpk,981673984,0 #CRIFS,599,0,Load,actstgdata.lua,0,3512,sonic2010_0.cpk,75776,0 #CRIFS,612,0,Load,sound/curve_table.sndc.orc,0,284,sonic2010_0.cpk,983186048,0 #CRIFS,626,0,Load,sound/cue_name_list.sndl.orc,0,788,sonic2010_0.cpk,32509952,0 #CRIFS,639,0,Load,sound/bgm.strm.csb,0,83408,sonic2010_0.cpk,32425984,0 #CRIFS,653,0,Load,sound/se_voice_eggman_announce.strm.csb,0,6864,sonic2010_0.cpk,49022976,0 #CRIFS,667,0,Load,sound/se_voice_system.csb,0,468544,sonic2010_0.cpk,49672192,0 #CRIFS,680,0,Load,sound/se_system_mainmenu.csb,0,73728,sonic2010_0.cpk,48613376,0 #CRIFS,694,0,Load,sound/se_system_multi.csb,0,115104,sonic2010_0.cpk,48687104,0 #CRIFS,710,0,Load,warning.arc,0,20428,sonic2010_0.cpk,903059744,0 #CRIFS,724,0,Load,ui/ui_universal.arc,0,20796,sonic2010_0.cpk,968277952,0 #CRIFS,739,0,Load,event_info.lua,0,2024,sonic2010_0.cpk,903057408,0 #CRIFS,755,0,Load,testmission.lua,0,2856,sonic2010_0.cpk,25917440,0 #CRIFS,771,0,Load,debug.arc,0,61,sonic2010_0.cpk,11300864,0 #CRIFS,1727,0,Load,ui/ui_resident_j.arc,0,176636,sonic2010_0.cpk,918825632,0 #CRIFS,1872,,End,START_UP #CRIFS,77,,Begin,START_UP #CRIFS,87,0,Load,strap/strap_j.arc,0,50056,sonic2010_0.cpk,837058560,0 #CRIFS,167,0,Load,hbm/hbm_j.arc,0,463796,sonic2010_0.cpk,27785216,0 #CRIFS,180,0,Load,font.brfnt,0,496592,sonic2010_0.cpk,15863808,0 #CRIFS,527,0,Load,sonic2010/RVL_DefaultDO.sel,0,7456,Standard,0,0 #CRIFS,540,0,Load,hbm_module.rso,0,132872,sonic2010_0.cpk,16361472,0 #CRIFS,556,0,Load,save_banner.arc,0,26600,sonic2010_0.cpk,24279040,0 #CRIFS,569,0,Load,actstgmission.lua,0,6076,sonic2010_0.cpk,981673984,0 #CRIFS,583,0,Load,actstgdata.lua,0,3512,sonic2010_0.cpk,75776,0 #CRIFS,597,0,Load,sound/curve_table.sndc.orc,0,284,sonic2010_0.cpk,983186048,0 #CRIFS,610,0,Load,sound/cue_name_list.sndl.orc,0,788,sonic2010_0.cpk,32509952,0 #CRIFS,624,0,Load,sound/bgm.strm.csb,0,83408,sonic2010_0.cpk,32425984,0 #CRIFS,638,0,Load,sound/se_voice_eggman_announce.strm.csb,0,6864,sonic2010_0.cpk,49022976,0 #CRIFS,654,0,Load,sound/se_voice_system.csb,0,468544,sonic2010_0.cpk,49672192,0 #CRIFS,669,0,Load,sound/se_system_mainmenu.csb,0,73728,sonic2010_0.cpk,48613376,0 #CRIFS,683,0,Load,sound/se_system_multi.csb,0,115104,sonic2010_0.cpk,48687104,0 #CRIFS,698,0,Load,warning.arc,0,20428,sonic2010_0.cpk,903059744,0 #CRIFS,712,0,Load,ui/ui_universal.arc,0,20796,sonic2010_0.cpk,968277952,0 #CRIFS,726,0,Load,event_info.lua,0,2024,sonic2010_0.cpk,903057408,0 #CRIFS,740,0,Load,testmission.lua,0,2856,sonic2010_0.cpk,25917440,0 #CRIFS,755,0,Load,debug.arc,0,61,sonic2010_0.cpk,11300864,0 #CRIFS,1795,0,Load,ui/ui_resident_j.arc,0,176636,sonic2010_0.cpk,918825632,0 #CRIFS,1940,,End,START_UP #CRIFS,77,,Begin,START_UP #CRIFS,86,0,Load,strap/strap_j.arc,0,50056,sonic2010_0.cpk,837058560,0 #CRIFS,184,0,Load,hbm/hbm_j.arc,0,463796,sonic2010_0.cpk,27785216,0 #CRIFS,198,0,Load,font.brfnt,0,496592,sonic2010_0.cpk,15863808,0 #CRIFS,541,0,Load,sonic2010/RVL_DefaultDO.sel,0,7456,Standard,0,0 #CRIFS,555,0,Load,hbm_module.rso,0,132872,sonic2010_0.cpk,16361472,0 #CRIFS,569,0,Load,save_banner.arc,0,26600,sonic2010_0.cpk,24279040,0 #CRIFS,582,0,Load,actstgmission.lua,0,6076,sonic2010_0.cpk,981673984,0 #CRIFS,596,0,Load,actstgdata.lua,0,3512,sonic2010_0.cpk,75776,0 #CRIFS,610,0,Load,sound/curve_table.sndc.orc,0,284,sonic2010_0.cpk,983186048,0 #CRIFS,624,0,Load,sound/cue_name_list.sndl.orc,0,788,sonic2010_0.cpk,32509952,0 #CRIFS,639,0,Load,sound/bgm.strm.csb,0,83408,sonic2010_0.cpk,32425984,0 #CRIFS,653,0,Load,sound/se_voice_eggman_announce.strm.csb,0,6864,sonic2010_0.cpk,49022976,0 #CRIFS,669,0,Load,sound/se_voice_system.csb,0,468544,sonic2010_0.cpk,49672192,0 #CRIFS,682,0,Load,sound/se_system_mainmenu.csb,0,73728,sonic2010_0.cpk,48613376,0 #CRIFS,695,0,Load,sound/se_system_multi.csb,0,115104,sonic2010_0.cpk,48687104,0 #CRIFS,710,0,Load,warning.arc,0,20428,sonic2010_0.cpk,903059744,0 #CRIFS,725,0,Load,ui/ui_universal.arc,0,20796,sonic2010_0.cpk,968277952,0 #CRIFS,739,0,Load,event_info.lua,0,2024,sonic2010_0.cpk,903057408,0 #CRIFS,752,0,Load,testmission.lua,0,2856,sonic2010_0.cpk,25917440,0 #CRIFS,766,0,Load,debug.arc,0,61,sonic2010_0.cpk,11300864,0 #CRIFS,1878,0,Load,ui/ui_resident_j.arc,0,176636,sonic2010_0.cpk,918825632,0 #CRIFS,2056,,End,START_UP #CRIFS,4752,,Begin,STG110 #CRIFS,4808,0,Load,loading/loading0.lua,0,360,sonic2010_0.cpk,906243744,0 #CRIFS,4821,0,Load,loading/loading0.arc,0,144660,sonic2010_0.cpk,922929760,0 #CRIFS,4836,0,Load,stg110/stg110_config.lua,0,1296,sonic2010_0.cpk,601272320,0 #CRIFS,4859,0,Load,set/stg110_obj_00.orc,0,24064,sonic2010_0.cpk,31256576,0 #CRIFS,4890,0,Load,set/stg110_obj_04.orc,0,1484,sonic2010_0.cpk,31281152,0 #CRIFS,4904,0,Load,set/stg110_obj_05.orc,0,2080,sonic2010_0.cpk,31283200,0 #CRIFS,4918,0,Load,set/stg110_obj_06.orc,0,1968,sonic2010_0.cpk,31287296,0 #CRIFS,4934,0,Load,set/stg110_obj_07.orc,0,1044,sonic2010_0.cpk,31289344,0 #CRIFS,4988,1,Load,sound/Synth/bgm_stg110_rso_fx_wav.aax,0,2048,sonic2010_0.cpk,187269120,0 #CRIFS,5116,1,Load,sound/Synth/bgm_stg110_rso_wav.aax,0,2048,sonic2010_0.cpk,191016960,0 #CRIFS,7817,0,Load,common_object.arc,0,950260,sonic2010_0.cpk,981680064,0 #CRIFS,7832,0,Load,sound/se_system_actionstage.csb,0,398864,sonic2010_0.cpk,47902720,0 #CRIFS,7848,0,Load,sound/se_ambience_common.csb,0,384664,sonic2010_0.cpk,32593920,0 #CRIFS,7863,0,Load,sound/se_object_common.csb,0,2150576,sonic2010_0.cpk,878590016,0 #CRIFS,7876,0,Load,sound/se_player_sonic.csb,0,2127032,sonic2010_0.cpk,45774848,0 #CRIFS,7891,0,Load,sound/se_voice_sonic_action_e.csb,0,449376,sonic2010_0.cpk,49031168,0 #CRIFS,7906,0,Load,EnemyCommon.arc,0,104072,sonic2010_0.cpk,12077056,0 #CRIFS,7922,0,Load,EnemyEggPawn.arc,0,625308,sonic2010_0.cpk,12408832,0 #CRIFS,7938,0,Load,sound/se_enemy_common.csb,0,310280,sonic2010_0.cpk,37672960,0 #CRIFS,7953,0,Load,sound/se_enemy_eggpawn.csb,0,175200,sonic2010_0.cpk,37984256,0 #CRIFS,7968,0,Load,player_Sonic.arc,0,4029564,sonic2010_0.cpk,873068608,0 #CRIFS,7982,0,Load,player_sonic.anm,0,7080,sonic2010_0.cpk,19433472,0 #CRIFS,7996,0,Load,player_ph_laser.arc,0,53908,sonic2010_0.cpk,18757632,0 #CRIFS,8009,0,Load,player_ph_drill.arc,0,98980,sonic2010_0.cpk,18538496,0 #CRIFS,8023,0,Load,hint_stg110.xtb,0,3776,sonic2010_0.cpk,16496640,0 #CRIFS,8037,0,Load,hint_stg110.hdb,0,1152,sonic2010_0.cpk,16494592,0 #CRIFS,8050,0,Load,interface_list.xtb,0,263,sonic2010_0.cpk,982630336,0 #CRIFS,8064,0,Load,stg110/stg110_cmn.arc,0,31936,sonic2010_0.cpk,601239552,0 #CRIFS,8078,0,Load,stg110/stg110_tex.brres,0,6363724,sonic2010_0.cpk,601819136,0 #CRIFS,8091,0,Load,stg110/stg110_obj.arc,0,91008,sonic2010_0.cpk,601274368,0 #CRIFS,8105,0,Load,stg100_obj.arc,0,180044,sonic2010_0.cpk,24305664,0 #CRIFS,8119,0,Load,stg110/stg110_path.arc,0,426792,sonic2010_0.cpk,881311168,0 #CRIFS,8369,0,Load,EnemyEggPawn_01rso.arc,0,120660,sonic2010_0.cpk,13035520,0 #CRIFS,8417,0,Load,EnemySpinner.arc,0,92428,sonic2010_0.cpk,15745024,0 #CRIFS,8431,0,Load,sound/se_enemy_spinner.csb,0,18608,sonic2010_0.cpk,38576128,0 #CRIFS,8445,0,Load,obj_spin.arc,0,19080,sonic2010_0.cpk,17649664,0 #CRIFS,8459,0,Load,ui/ui_game_j.arc,0,203908,sonic2010_0.cpk,900927296,0 #CRIFS,8472,0,Load,ui/ui_cockpit_j.arc,0,108252,sonic2010_0.cpk,837640192,0 #CRIFS,15543,0,Load,sound/se_object_rso.csb,0,132528,sonic2010_0.cpk,42506240,0 #CRIFS,15556,0,Load,sound/se_ambience_rso.csb,0,71840,sonic2010_0.cpk,33439744,0 #CRIFS,15570,0,Load,sound/se_phantom_laser.csb,0,426984,sonic2010_0.cpk,43155456,0 #CRIFS,15584,0,Load,sound/se_phantom_spin.csb,0,446696,sonic2010_0.cpk,45056000,0 #CRIFS,15598,0,Load,stg110/stg110_01.arc,0,604524,sonic2010_0.cpk,586698752,0 #CRIFS,15612,0,Load,stg110/stg110_02.arc,0,559460,sonic2010_0.cpk,587304960,0 #CRIFS,15625,0,Load,stg110/stg110_03.arc,0,595272,sonic2010_0.cpk,587866112,0 #CRIFS,15639,0,Load,stg110/stg110_27.arc,0,578972,sonic2010_0.cpk,600659968,0 #CRIFS,15653,0,Load,stg110/stg110_04.arc,0,591180,sonic2010_0.cpk,588462080,0 #CRIFS,4294941177,1,Load,sound/Synth/000_SYS04_E01_SP_wav.aax,0,2048,sonic2010_0.cpk,50141184,0 #CRIFS,4294946722,0,Load,stg110/stg110_05.arc,0,552132,sonic2010_0.cpk,589053952,0 #CRIFS,4294946737,0,Load,stg110/stg110_06.arc,0,543556,sonic2010_0.cpk,589606912,0 #CRIFS,4294946751,0,Load,stg110/stg110_07.arc,0,531884,sonic2010_0.cpk,590151680,0 #CRIFS,4294946288,,End,STG110 #CRIFS,4294954266,,Begin,STG320 #CRIFS,4294954324,0,Load,loading/loading2.lua,0,360,sonic2010_0.cpk,906244512,0 #CRIFS,4294954340,0,Load,loading/loading2.arc,0,84332,sonic2010_0.cpk,29388800,0 #CRIFS,4294954354,0,Load,stg320/stg320_config.lua,0,1164,sonic2010_0.cpk,686481408,0 #CRIFS,4294954379,0,Load,set/stg320_obj_00.orc,0,15712,sonic2010_0.cpk,972668192,0 #CRIFS,4294954424,0,Load,set/stg320_obj_06.orc,0,212,sonic2010_0.cpk,983179648,0 #CRIFS,4294954437,0,Load,set/stg320_obj_07.orc,0,260,sonic2010_0.cpk,983179872,0 #CRIFS,4294954508,1,Load,sound/Synth/bgm_stg320_shp_fx_wav.aax,0,2048,sonic2010_0.cpk,261384192,0 #CRIFS,4294954652,1,Load,sound/Synth/bgm_stg320_shp_nomal_wav.aax,0,2048,sonic2010_0.cpk,265848832,0 #CRIFS,4294956369,0,Load,common_object.arc,0,950260,sonic2010_0.cpk,981680064,0 #CRIFS,4294956383,0,Load,sound/se_system_actionstage.csb,0,398864,sonic2010_0.cpk,47902720,0 #CRIFS,4294956397,0,Load,sound/se_ambience_common.csb,0,384664,sonic2010_0.cpk,32593920,0 #CRIFS,4294956412,0,Load,sound/se_object_common.csb,0,2150576,sonic2010_0.cpk,878590016,0 #CRIFS,4294956426,0,Load,sound/se_player_sonic.csb,0,2127032,sonic2010_0.cpk,45774848,0 #CRIFS,4294956441,0,Load,sound/se_voice_sonic_action_e.csb,0,449376,sonic2010_0.cpk,49031168,0 #CRIFS,4294956455,0,Load,EnemyCommon.arc,0,104072,sonic2010_0.cpk,12077056,0 #CRIFS,4294956469,0,Load,EnemyEggPawn.arc,0,625308,sonic2010_0.cpk,12408832,0 #CRIFS,4294956482,0,Load,sound/se_enemy_common.csb,0,310280,sonic2010_0.cpk,37672960,0 #CRIFS,4294956496,0,Load,sound/se_enemy_eggpawn.csb,0,175200,sonic2010_0.cpk,37984256,0 #CRIFS,4294956512,0,Load,player_Sonic.arc,0,4029564,sonic2010_0.cpk,873068608,0 #CRIFS,4294956528,0,Load,player_sonic.anm,0,7080,sonic2010_0.cpk,19433472,0 #CRIFS,4294956543,0,Load,player_ph_astro.arc,0,49420,sonic2010_0.cpk,971864544,0 #CRIFS,4294956559,0,Load,hint_stg110.xtb,0,3776,sonic2010_0.cpk,16496640,0 #CRIFS,4294956575,0,Load,hint_stg110.hdb,0,1152,sonic2010_0.cpk,16494592,0 #CRIFS,4294956590,0,Load,interface_list.xtb,0,263,sonic2010_0.cpk,982630336,0 #CRIFS,4294956606,0,Load,stg320/stg320_cmn.arc,0,56004,sonic2010_0.cpk,686424064,0 #CRIFS,4294956621,0,Load,stg320/stg320_tex.brres,0,4142764,sonic2010_0.cpk,959853952,0 #CRIFS,4294956635,0,Load,stg320/stg320_obj.arc,0,36624,sonic2010_0.cpk,882013952,0 #CRIFS,4294956651,0,Load,stg300_obj.arc,0,373044,sonic2010_0.cpk,982630816,0 #CRIFS,4294956666,0,Load,stg320/stg320_path.arc,0,55228,sonic2010_0.cpk,882050592,0 #CRIFS,4294956908,0,Load,EnemyEggChaser.arc,0,227148,sonic2010_0.cpk,12181504,0 #CRIFS,4294956922,0,Load,sound/se_enemy_airchaser.csb,0,316720,sonic2010_0.cpk,33593344,0 #CRIFS,4294956982,0,Load,EnemyEggPawn_03shp.arc,0,147068,sonic2010_0.cpk,13293568,0 #CRIFS,4294957031,0,Load,EnemyLander.arc,0,37684,sonic2010_0.cpk,14712832,0 #CRIFS,4294957045,0,Load,sound/se_enemy_lander.csb,0,11624,sonic2010_0.cpk,38258688,0 #CRIFS,4294957072,0,Load,EnemySpinner.arc,0,92428,sonic2010_0.cpk,15745024,0 #CRIFS,4294957086,0,Load,sound/se_enemy_spinner.csb,0,18608,sonic2010_0.cpk,38576128,0 #CRIFS,4294957099,0,Load,EnemySpanner.arc,0,129392,sonic2010_0.cpk,15515648,0 #CRIFS,4294957136,0,Load,ui/ui_game_j.arc,0,203908,sonic2010_0.cpk,900927296,0 #CRIFS,4294957150,0,Load,ui/ui_cockpit_j.arc,0,108252,sonic2010_0.cpk,837640192,0 #CRIFS,4294963225,0,Load,sound/se_object_shp.csb,0,401944,sonic2010_0.cpk,42639360,0 #CRIFS,4294963241,0,Load,sound/se_ambience_shp.csb,0,78400,sonic2010_0.cpk,33513472,0 #CRIFS,4294963256,0,Load,sound/se_phantom_astronautes.csb,0,112608,sonic2010_0.cpk,43042816,0 #CRIFS,4294963272,0,Load,stg320/stg320_01.arc,0,461164,sonic2010_0.cpk,682029056,0 #CRIFS,4294963285,0,Load,stg320/stg320_02.arc,0,450896,sonic2010_0.cpk,682491904,0 #CRIFS,4294963299,0,Load,stg320/stg320_03.arc,0,508188,sonic2010_0.cpk,682944512,0 #CRIFS,4294963313,0,Load,stg320/stg320_04.arc,0,630004,sonic2010_0.cpk,683454464,0 #CRIFS,4294963326,0,Load,stg320/stg320_05.arc,0,523972,sonic2010_0.cpk,684085248,0 #CRIFS,4419,0,Load,stg320/stg320_06.arc,0,343764,sonic2010_0.cpk,684609536,0 #CRIFS,4433,0,Load,stg320/stg320_07.arc,0,451792,sonic2010_0.cpk,684953600,0 #CRIFS,4447,0,Load,stg320/stg320_08.arc,0,477060,sonic2010_0.cpk,685406208,0 #CRIFS,4294935481,0,Load,stg320/stg320_09.arc,0,364912,sonic2010_0.cpk,685883392,0 #CRIFS,4294949714,0,Load,stg320/stg320_10.arc,0,173904,sonic2010_0.cpk,686249984,0 #CRIFS,4294951249,0,Load,stg320/stg320_02.arc,0,450896,sonic2010_0.cpk,682491904,0 #CRIFS,4294952782,0,Load,stg320/stg320_10.arc,0,173904,sonic2010_0.cpk,686249984,0 #CRIFS,4294953167,0,Load,stg320/stg320_02.arc,0,450896,sonic2010_0.cpk,682491904,0 #CRIFS,4294954603,0,Load,stg320/stg320_10.arc,0,173904,sonic2010_0.cpk,686249984,0 #CRIFS,4294957888,0,Load,stg320/stg320_02.arc,0,450896,sonic2010_0.cpk,682491904,0 #CRIFS,4294948482,0,Load,stg320/stg320_10.arc,0,173904,sonic2010_0.cpk,686249984,0 #CRIFS,4294950385,0,Load,stg320/stg320_02.arc,0,450896,sonic2010_0.cpk,682491904,0 #CRIFS,4294951902,0,Load,stg320/stg320_10.arc,0,173904,sonic2010_0.cpk,686249984,0 #CRIFS,4294952287,0,Load,stg320/stg320_02.arc,0,450896,sonic2010_0.cpk,682491904,0 #CRIFS,4294953590,0,Load,stg320/stg320_10.arc,0,173904,sonic2010_0.cpk,686249984,0 #CRIFS,720,,End,STG320
delete_cpk.bat
A script to delete the CriWare packs and associated content.
@echo off @set CPK_NAME=sonic2010 @set CPK_OUT_DIR=..\dvd @echo cpk及び、cpk関連ファイルを削除します。 @if exist %CPK_OUT_DIR%\%CPK_NAME%.cpk @del %CPK_OUT_DIR%\%CPK_NAME%.cpk @if exist %CPK_NAME%.cpk @del %CPK_NAME%.cpk @if exist %CPK_NAME%.csv @del %CPK_NAME%.csv @if exist CpkFileBuilder.log @del CpkFileBuilder.log @for /L %%I IN (0,1,1) DO ( @if exist %CPK_OUT_DIR%\%CPK_NAME%_%%I.cpk @del %CPK_OUT_DIR%\%CPK_NAME%_%%I.cpk @if exist %CPK_NAME%_%%I.cpk @del %CPK_NAME%_%%I.cpk @if exist %CPK_NAME%_%%I.csv @del %CPK_NAME%_%%I.csv ) @echo done. @pause
make_cpk.bat
A script to make the CriWare pack for the game.
@echo off @set CPK_IMAGE_DIR=sonic2010 @set CPK_NAME=sonic2010 @set CPK_OUT_DIR=..\dvd @for /L %%I IN (0,1,1) DO ( @if exist %CPK_NAME%_%%I.csv ( @del %CPK_NAME%_%%I.csv ) ..\tools\CriCsvConverter -root=%CPK_IMAGE_DIR% -out=%CPK_NAME%_%%I.csv -compress -nlist=%CPK_NAME%_%%I_csv_setting.txt -view @if exist %CPK_NAME%_%%I.csv ( ..\tools\cri\cpkmakec %CPK_NAME%_%%I.csv %CPK_OUT_DIR%\%CPK_NAME%_%%I.cpk -align=32 -code=SJIS -mode=FILENAME -add -mask -view ) else ( @if exist %CPK_OUT_DIR%\%CPK_NAME%_%%I.cpk ( @del %CPK_OUT_DIR%\%CPK_NAME%_%%I.cpk ) ) @goto end ) :end @pause
sonic2010_0_csv_setting.txt
# このファイルは、CPK用のCSVに意図的に除外したいファイル等を書き込んでおくものです。 # ディレクトリ、ファイル共に '\' or '/' でディレクトリを指定する # 先頭にルートディレクトリは付けない # -- サーチ不要なディレクトリ -- # <> でくくると、サブフォルダの同一名ディレクトリも対象 # (サブフォルダ指定では<>は使用出来ません) # * など検索文字列等も対応していません [NEGATIVE_DIR] <.svn> <movie> # -- サーチ不要なファイル -- # *.txt など検索文字列等でも指定可能 # <> で一致しているフォルダ全て対象 [NEGATIVE_FILES] # -- 非圧縮ファイル -- # 通常、全て圧縮を試み圧縮できない場合は圧縮しませんが、絶対に圧縮してはいけないもの等を指定しておく事も出来ます。 # ※CRIの圧縮は一括でメモリに読み込める事が条件ですが、ストリーム系データに圧縮を適用する事はできません。 # *.txt など検索文字列等でも指定可能 # <> で一致しているフォルダ全て対象 [UNCOMPRESS_FILES] <*.adx> <*.aax> <*.csb> <*.sfd> # -- 圧縮ファイル -- # -compressが設定されていない場合、こっちを適用する [COMPRESS_FILES]
sonic2010_1_csv_setting.txt
# このファイルは、CPK用のCSVに意図的に除外したいファイル等を書き込んでおくものです。 # ディレクトリ、ファイル共に '\' or '/' でディレクトリを指定する # 先頭にルートディレクトリは付けない # -- サーチ不要なディレクトリ -- # <> でくくると、サブフォルダの同一名ディレクトリも対象 # (サブフォルダ指定では<>は使用出来ません) # * など検索文字列等も対応していません [NEGATIVE_DIR] <.svn> <event> <hbm> <loading> <movie> <result_bg> <scripts> <set> <sound> <staffroll> <strap> <title> <ui> <worldmap> # -- サーチ不要なファイル -- # *.txt など検索文字列等でも指定可能 # <> で一致しているフォルダ全て対象 [NEGATIVE_FILES] <stg*> *.arc *.lua *.xtb *.nbx *.hdb *.brfnt *.rso *.anm # -- 非圧縮ファイル -- # 通常、全て圧縮を試み圧縮できない場合は圧縮しませんが、絶対に圧縮してはいけないもの等を指定しておく事も出来ます。 # ※CRIの圧縮は一括でメモリに読み込める事が条件ですが、ストリーム系データに圧縮を適用する事はできません。 # *.txt など検索文字列等でも指定可能 # <> で一致しているフォルダ全て対象 [UNCOMPRESS_FILES] <*.adx> <*.aax> <*.csb> <*.sfd> # -- 圧縮ファイル -- # -compressが設定されていない場合、こっちを適用する [COMPRESS_FILES]
sonic2010_csv_setting.txt
# このファイルは、CPK用のCSVに意図的に除外したいファイル等を書き込んでおくものです。 # ディレクトリ、ファイル共に '\' or '/' でディレクトリを指定する # 先頭にルートディレクトリは付けない # -- サーチ不要なディレクトリ -- # <> でくくると、サブフォルダの同一名ディレクトリも対象 # (サブフォルダ指定では<>は使用出来ません) # * など検索文字列等も対応していません [NEGATIVE_DIR] <.svn> # -- サーチ不要なファイル -- # *.txt など検索文字列等でも指定可能 # <> で一致しているフォルダ全て対象 [NEGATIVE_FILES] # -- 非圧縮ファイル -- # 通常、全て圧縮を試み圧縮できない場合は圧縮しませんが、絶対に圧縮してはいけないもの等を指定しておく事も出来ます。 # ※CRIの圧縮は一括でメモリに読み込める事が条件ですが、ストリーム系データに圧縮を適用する事はできません。 # *.txt など検索文字列等でも指定可能 # <> で一致しているフォルダ全て対象 [UNCOMPRESS_FILES] <*.adx> <*.sfd> <*.aax> <*.csb> # -- 圧縮ファイル -- # -compressが設定されていない場合、こっちを適用する [COMPRESS_FILES]
text Directory
Most content here is unlocalized files. However a few directories were mistakenly placed in it.
sound Directory
To do: todo |
staffroll Directory
Not only source localization files are here, but a variety of scripts from Blind Squirrel Games!
bsg_credit_converter.py
import xlrd import sys import PIL from PIL import Image write_jp = False write_bsg = False for arg in sys.argv: if (arg == "--jp"): write_jp = True if (arg == "--bsg"): write_bsg = True def CopyTextToFile(my_input, output, write_type): with open(my_input, "r", encoding="utf8") as f_input, open(output, write_type, encoding="utf8") as f_output: for line in f_input: f_output.writelines(line) def WriteBsgStaffToFile(): loc = ("BSG_Rainbow_Credits.xlsx") wb = xlrd.open_workbook(loc) sheet = wb.sheet_by_index(0) sheet.cell_value(0, 0) sheet.row_values(1) #In the bsg excel sheet, they have 15 rows at the beginnning that is just info #Using this var to make sure we start generating on the right row staffroll_begin_index = 15 #Using number to append to new company tag number #Starting with 15 because thats where the japan staff roll company leaves off company_index = 16 staff_h_index = 0 staff_t_index = 0 staff_n_index = 0 #My formula for finding the correct spacing between pages #(longest width in a page - default page width) + default space between page #(page_x_offset - page_width) + space_between_pages page_x_offset = 504; page_width = 504 space_between_pages = 120 space_between_name_pages = 60 linesToWrite = [] lineCount = 0; TextMaxWidth = 45 ImgLeftSideSpacingScaler = 0.18 ImgRightSideSpacingScaler = 0.2 prevWasHeader = False bsg_staffroll_f = open("staffroll.xml", "a", encoding="utf8") bsg_staffroll_scr_f = open("staffroll_scr.xml", "a", encoding="utf8") bsg_staffroll_f.write(" <!--============================================== Blind Squirrel Games ==============================================-->\n") bsg_staffroll_scr_f.write(" <!--============================================== Blind Squirrel Games ==============================================-->\n") linesToWrite.append(" <page x=\"" + str((page_x_offset - page_width ) + space_between_pages) + "\">\n") page_x_offset = -999 #Looping through bsg excel sheet #With each iteration I will generate text for both "staffroll" (the tags) and "staffroll_scr" (the xml that gets converted to arc) for i in range(sheet.nrows): if(sheet.row_values(i)[1] == "break"): if(lineCount > 0): if(lineCount <= 1): lineCount = 0 offset = 180 * ((lineCount) / 5) linesToWrite[0] = linesToWrite[0].replace("FILL", str( 180 - offset)) lineCount = 0 for j in linesToWrite: bsg_staffroll_scr_f.write(j) bsg_staffroll_scr_f.write(" </page>\n") index = 0 searchingNext = True foundImage = False imgName = "" while(searchingNext): row = sheet.row_values(i + index)[2] if(len(row) > 2): searchingNext = False if(row == "Image"): foundImage = True imgName = sheet.row_values(i + index)[3] index += 1 if(foundImage): path = "../../../acorn/staffroll/staffroll/images/" + imgName img = PIL.Image.open(path) # fetching the dimensions wid, hgt = img.size new_spacing = wid * ImgLeftSideSpacingScaler bsg_staffroll_scr_f.write(" <page x=\"" + str((page_x_offset - page_width ) + space_between_pages + new_spacing) + "\">\n") else: bsg_staffroll_scr_f.write(" <page x=\"" + str((page_x_offset - page_width ) + space_between_pages) + "\">\n") linesToWrite.clear() prevWasHeader = False page_x_offset = 0; continue if( i < (staffroll_begin_index - 1) or sheet.row_values(i)[3] == "" or sheet.row_values(i)[3] == " " or sheet.row_values(i)[3] == " "): continue #2K_Sonic_Colors_Logo_ULTIMATE_US_FLAT.tga #Converting "and" or "&" because Sega tool don't like those staff_roll_text = sheet.row_values(i)[3].upper() staff_roll_text = staff_roll_text.replace("Á", "#0A") staff_roll_text = staff_roll_text.replace("á", "#0a") staff_roll_text = staff_roll_text.replace("É", "#0E") staff_roll_text = staff_roll_text.replace("é", "#0e") staff_roll_text = staff_roll_text.replace("È", "#4u") staff_roll_text = staff_roll_text.replace("è", "#47") staff_roll_text = staff_roll_text.replace("Ü", "#4w") staff_roll_text = staff_roll_text.replace("ü", "#49") if(staff_roll_text[0] == '\"'): staff_roll_text = staff_roll_text.replace("\"", "#41", 1) #Starting quotes staff_roll_text = staff_roll_text.replace(" \"", " #41") #Ending quotes staff_roll_text = staff_roll_text.replace("\"", "#42") staff_roll_text = staff_roll_text.replace("©", "#44") staff_roll_text = staff_roll_text.replace("&", "&") staff_roll_text = staff_roll_text.replace(" & ", " & ") staff_roll_text = staff_roll_text.replace(" AND ", " & ") staff_roll_text = staff_roll_text.replace("\n", " ") staff_roll_text_length = len(sheet.row_values(i)[3]) bsg_staffroll_f.write(" <Row ss:AutoFitHeight=\"0\" ss:Height=\"36\">\n") text_width = 0 #==================================================================================================================================================================================================================== #--------------------------------------------------------------------------------------------COMPANY #==================================================================================================================================================================================================================== if(sheet.row_values(i)[2] == "Company"): #In the original xml the numbers used for single digits use "00, 01, 02, etc." just trying to keep parity zero_char = '' if(company_index < 10): zero_char = '0' text_width = staff_roll_text_length * 24 #GENERATING STAFFROLL bsg_staffroll_f.write(" <Cell><Data ss:Type=\"String\">company_" + zero_char + str(company_index) + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell ss:StyleID=\"s127\"><Data ss:Type=\"String\">" + staff_roll_text + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell ss:StyleID=\"s69\" ss:Formula=\"=LEN(RC[-1])\"><Data ss:Type=\"Number\">" + str(staff_roll_text_length) + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell><Data ss:Type=\"Number\">" + str(text_width)+ "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell><Data ss:Type=\"Number\">8</Data></Cell>\n") #GENERATING STAFFROLL_SCR #So from what I can tell looking at the phantom numbers (the numbers that never specified how they work) #for "x" and "y" the patteren i saw was if the header text had like 1 or 2 staff name entires you'd put y=180 #for the text to align in the middle of the screen but if the header text had more than like 3 entries of names #you'd put "y=90" instead to change the height and expand the range for the entries if(page_x_offset == 0): linesToWrite.append(" <data cmd=\"TEXT\" tag=\"company_" + zero_char + str(company_index) + "\" x=\"0\" y=\"FILL\" type=\"NORMAL\" broken=\"true\">\n") elif(prevWasHeader): linesToWrite.append(" <data cmd=\"TEXT\" tag=\"company_" + zero_char + str(company_index) + "\" x=\"0\" y=\"30\" type=\"NORMAL\" broken=\"true\">\n") else: linesToWrite.append(" <data cmd=\"TEXT\" tag=\"company_" + zero_char + str(company_index) + "\" x=\"0\" y=\"60\" type=\"NORMAL\" broken=\"true\">\n") linesToWrite.append(" <param no=\"1\" broken=\"true\" rbox=\"RINGx5\" lockon=\"false\"></param>\n") linesToWrite.append(" <param no=\"4\" broken=\"true\" rbox=\"RINGx10\" lockon=\"true\"></param>\n") linesToWrite.append(" <param no=\"6\" broken=\"true\" rbox=\"RINGx10\" lockon=\"false\"></param>\n") #linesToWrite.append(" <param no=\"13\" broken=\"true\" rbox=\"RINGx5\" lockon=\"false\"></param>\n") #linesToWrite.append(" <param no=\"14\" broken=\"true\" rbox=\"RINGx5\" lockon=\"true\"></param>\n") linesToWrite.append(" </data>\n") prevWasHeader = True company_index += 1 lineCount += 1 #==================================================================================================================================================================================================================== #--------------------------------------------------------------------------------------------IMAGE #==================================================================================================================================================================================================================== elif(sheet.row_values(i)[2] == "Image"): path = "../../../acorn/staffroll/staffroll/images/" + sheet.row_values(i)[3] # loading the image img = PIL.Image.open(path) # fetching the dimensions wid, hgt = img.size staff_roll_text = sheet.row_values(i)[3][ 0 : staff_roll_text.index(".")] text_width = wid * ImgRightSideSpacingScaler #print(staff_roll_text + ": (" + str(wid) + " " + str(hgt) + ") ~ scaled width: " + str(text_width)); # Can't use "staff_roll_text" cause i captilize all the letters #if(page_x_offset == 0): # linesToWrite.append(" <data cmd=\"IMAGE\" name=\"" + sheet.row_values(i)[3] + "\" x=\"0\" y=\"FILL\" />\n") #else: linesToWrite.append(" <data cmd=\"IMAGE\" name=\"" + staff_roll_text + "\" x=\"0\" y=\"180\" />\n") lineCount += 1 #==================================================================================================================================================================================================================== #--------------------------------------------------------------------------------------------HEADER #==================================================================================================================================================================================================================== elif(sheet.row_values(i)[2] == "Header"): zero_char = '' if(staff_h_index < 10): zero_char = '0' text_width = staff_roll_text_length * 18.66 #GENERATING STAFFROLL bsg_staffroll_f.write(" <Cell ss:StyleID=\"s128\"><Data ss:Type=\"String\">staff_h_" + zero_char + str(staff_h_index) + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell ss:StyleID=\"s129\"><Data ss:Type=\"String\">" + staff_roll_text + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell ss:StyleID=\"s69\" ss:Formula=\"=LEN(RC[-1])\"><Data ss:Type=\"Number\">" + str(staff_roll_text_length) + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell><Data ss:Type=\"Number\">" + str(text_width)+ "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell><Data ss:Type=\"Number\">8</Data></Cell>\n") #GENERATING STAFFROLL_SCR if(page_x_offset == 0): linesToWrite.append(" <data cmd=\"TEXT\" tag=\"staff_h_" + zero_char + str(staff_h_index) + "\" x=\"0\" y=\"FILL\" type=\"NORMAL\" broken=\"true\">\n") elif(prevWasHeader): linesToWrite.append(" <data cmd=\"TEXT\" tag=\"staff_h_" + zero_char + str(staff_h_index) + "\" x=\"0\" y=\"30\" type=\"NORMAL\" broken=\"true\">\n") else: linesToWrite.append(" <data cmd=\"TEXT\" tag=\"staff_h_" + zero_char + str(staff_h_index) + "\" x=\"0\" y=\"60\" type=\"NORMAL\" broken=\"true\">\n") linesToWrite.append(" </data>\n") prevWasHeader = True staff_h_index += 1 lineCount += 1 #==================================================================================================================================================================================================================== #--------------------------------------------------------------------------------------------CATEGORY #==================================================================================================================================================================================================================== elif(sheet.row_values(i)[2] == "Category"): zero_char = '' if(staff_t_index < 10): zero_char = '0' text_width = staff_roll_text_length * 18.66 #GENERATING STAFFROLL bsg_staffroll_f.write(" <Cell ss:StyleID=\"s128\"><Data ss:Type=\"String\">staff_t_" + zero_char + str(staff_t_index) + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell ss:StyleID=\"s129\"><Data ss:Type=\"String\">" + staff_roll_text + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell ss:StyleID=\"s69\" ss:Formula=\"=LEN(RC[-1])\"><Data ss:Type=\"Number\">" + str(staff_roll_text_length) + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell><Data ss:Type=\"Number\">" + str(text_width)+ "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell><Data ss:Type=\"Number\">8</Data></Cell>\n") #GENERATING STAFFROLL_SCR if(page_x_offset == 0): linesToWrite.append(" <data cmd=\"TEXT\" tag=\"staff_t_" + zero_char + str(staff_t_index) + "\" x=\"0\" y=\"FILL\" type=\"NORMAL\" broken=\"true\">\n") elif(prevWasHeader): linesToWrite.append(" <data cmd=\"TEXT\" tag=\"staff_t_" + zero_char + str(staff_t_index) + "\" x=\"0\" y=\"30\" type=\"NORMAL\" broken=\"true\">\n") else: linesToWrite.append(" <data cmd=\"TEXT\" tag=\"staff_t_" + zero_char + str(staff_t_index) + "\" x=\"0\" y=\"60\" type=\"NORMAL\" broken=\"true\">\n") linesToWrite.append(" </data>\n") prevWasHeader = True staff_t_index += 1 lineCount += 1 #==================================================================================================================================================================================================================== #--------------------------------------------------------------------------------------------INDIVIDUAL #==================================================================================================================================================================================================================== elif(sheet.row_values(i)[2] == "Individual"): zero_char = '' if(staff_n_index < 10): zero_char = '0' text_width = staff_roll_text_length * 16 #GENERATING STAFFROLL bsg_staffroll_f.write(" <Cell ss:StyleID=\"s70\"><Data ss:Type=\"String\">staff_n_" + zero_char + str(staff_n_index) + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell ss:StyleID=\"s83\"><Data ss:Type=\"String\">" + staff_roll_text + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell ss:StyleID=\"s69\" ss:Formula=\"=LEN(RC[-1])\"><Data ss:Type=\"Number\">" + str(staff_roll_text_length) + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell><Data ss:Type=\"Number\">" + str(text_width)+ "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell><Data ss:Type=\"Number\">8</Data></Cell>\n") #GENERATING STAFFROLL_SCR if(page_x_offset == 0): linesToWrite.append(" <data cmd=\"TEXT\" tag=\"staff_n_" + zero_char + str(staff_n_index) + "\" x=\"20\" y=\"FILL\" type=\"NORMAL\" broken=\"true\">\n") elif(prevWasHeader): linesToWrite.append(" <data cmd=\"TEXT\" tag=\"staff_n_" + zero_char + str(staff_n_index) + "\" x=\"20\" y=\"10\" type=\"NORMAL\" broken=\"true\">\n") prevWasHeader = False else: linesToWrite.append(" <data cmd=\"TEXT\" tag=\"staff_n_" + zero_char + str(staff_n_index) + "\" x=\"20\" y=\"30\" type=\"NORMAL\" broken=\"true\">\n") linesToWrite.append(" </data>\n") staff_n_index += 1 lineCount += 1 #==================================================================================================================================================================================================================== #--------------------------------------------------------------------------------------------TEXT #==================================================================================================================================================================================================================== elif(sheet.row_values(i)[2] == "Text"): forcePush = False leaveLoop = False stringCount = 0 stringsFound = 0 stringStart = 0 stringEnd = TextMaxWidth stringLen = len(staff_roll_text) while(not leaveLoop): stringStore = "" if(stringLen > stringEnd): stringsFound += 1 stringEnd = stringsFound * TextMaxWidth for char in staff_roll_text[stringEnd:]: if(char == " " or stringEnd == stringLen): break stringEnd += 1 stringCount = stringEnd - stringStart stringStore = staff_roll_text[stringStart : stringEnd] stringEnd += 1 stringStart = stringEnd else: leaveLoop = True forcePush = True if(stringsFound == 0): stringStore = staff_roll_text stringCount = len(staff_roll_text) if(not stringStore == ""): if(stringsFound > 1): bsg_staffroll_f.write(" <Row ss:AutoFitHeight=\"0\" ss:Height=\"36\">\n") zero_char = '' if(staff_n_index < 10): zero_char = '0' text_width = stringCount * 16 #GENERATING STAFFROLL bsg_staffroll_f.write(" <Cell ss:StyleID=\"s70\"><Data ss:Type=\"String\">staff_n_" + zero_char + str(staff_n_index) + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell ss:StyleID=\"s83\"><Data ss:Type=\"String\">" + stringStore + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell ss:StyleID=\"s69\" ss:Formula=\"=LEN(RC[-1])\"><Data ss:Type=\"Number\">" + str(stringCount) + "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell><Data ss:Type=\"Number\">" + str(text_width)+ "</Data></Cell>\n") bsg_staffroll_f.write(" <Cell><Data ss:Type=\"Number\">8</Data></Cell>\n") #GENERATING STAFFROLL_SCR if(page_x_offset == 0): linesToWrite.append(" <data cmd=\"TEXT\" tag=\"staff_n_" + zero_char + str(staff_n_index) + "\" x=\"20\" y=\"FILL\" type=\"NORMAL\" broken=\"true\">\n") else: linesToWrite.append(" <data cmd=\"TEXT\" tag=\"staff_n_" + zero_char + str(staff_n_index) + "\" x=\"20\" y=\"20\" type=\"NORMAL\" broken=\"true\">\n") linesToWrite.append(" </data>\n") staff_n_index += 1 lineCount += 1 if(page_x_offset < text_width): page_x_offset = text_width if(lineCount % 6 == 0 or forcePush): if(lineCount > 0): if(lineCount <= 1): lineCount = 0 offset = 110 * ((lineCount) / 5) linesToWrite[0] = linesToWrite[0].replace("FILL", str( 180 - offset)) lineCount = 0 for j in linesToWrite: bsg_staffroll_scr_f.write(j) bsg_staffroll_scr_f.write(" </page>\n") index = 1 searchingNext = True foundImage = False imgName = "" while(searchingNext): row = sheet.row_values(i + index)[2] if(len(row) > 2): searchingNext = False #print("hit after " + str(index) + " Cycles at line " + str(i + index) + " ~ " + row) if(row == "Image"): foundImage = True imgName = sheet.row_values(i + index)[3] index += 1 if(foundImage): path = "../../../acorn/staffroll/staffroll/images/" + imgName img = PIL.Image.open(path) # fetching the dimensions wid, hgt = img.size new_spacing = wid * ImgLeftSideSpacingScaler #print("" + str(new_spacing)) bsg_staffroll_scr_f.write(" <page x=\"" + str((page_x_offset - page_width ) + space_between_pages + new_spacing) + "\">\n") else: bsg_staffroll_scr_f.write(" <page x=\"" + str((page_x_offset - page_width ) + space_between_pages) + "\">\n") #bsg_staffroll_scr_f.write(" <page x=\"" + str((page_x_offset - page_width ) + space_between_pages) + "\">\n") linesToWrite.clear() page_x_offset = 0; forcePush = False if(not leaveLoop): bsg_staffroll_f.write(" </Row>\n") continue #==================================================================================================================================================================================================================== #--------------------------------------------------------------------------------------------SKIPPED #==================================================================================================================================================================================================================== else: print("EXCLUDED (Excel Row " + str(i) + "): [" + sheet.row_values(i)[2] + ": " + staff_roll_text + "]") #==================================================================================================================================================================================================================== #==================================================================================================================================================================================================================== bsg_staffroll_f.write(" </Row>\n") if(page_x_offset < text_width): page_x_offset = text_width bsg_staffroll_scr_f.write(" </page>\n") bsg_staffroll_f.close(); bsg_staffroll_scr_f.close(); #START OF MAIN FUNCTION CopyTextToFile("temp_gen_files\staffroll_beginning.txt", "staffroll.xml", "w") CopyTextToFile("temp_gen_files\staffroll_scr_beginning.txt", "staffroll_scr.xml", "w") if(write_jp): CopyTextToFile("temp_gen_files\staffroll_jp_beg.txt", "staffroll.xml", "a") CopyTextToFile("temp_gen_files\staffroll_scr_jp_beg.txt", "staffroll_scr.xml", "a") if(write_bsg): WriteBsgStaffToFile() if(write_jp): CopyTextToFile("temp_gen_files\staffroll_jp_end.txt", "staffroll.xml", "a") CopyTextToFile("temp_gen_files\staffroll_scr_jp_end.txt", "staffroll_scr.xml", "a") CopyTextToFile("temp_gen_files\staffroll_ending.txt", "staffroll.xml", "a") CopyTextToFile("temp_gen_files\staffroll_scr_ending.txt", "staffroll_scr.xml", "a")
BSG_Rainbow_Credits.xlsx
A credits file, the file was created on May 31st at 12:30 AM in 2010 and last saved on May 12th at 3:44 PM in 2021, suggesting SEGA simply sent a copy of their original source file for BSG to use.
Development Tools
To do: Document the tools individually. |
Among all the other leftover development data, there's lots of development tools located in the tools directory - including proprietary Sonic Team tools, CriWare tools, PhysX tools and even Wii SDK tools! The inclusion of Wii SDK tools is notable, as the Wii Programming Guidelines prohibit use of the tools to develop for different platforms. Most of the proprietary tools use Shift-JIS encoding so using a Japanese locale is recommended.
AnimationBindConverter/AnimationBindConverter.exe
AnimationBindConverter.exe <入力ファイル> 入力ファイル:XML
arcview.bat
A command line entry to run the U8 archiving tool to list files in an archive.
@echo off %~d0 cd %~dp0 @call darch.exe -tvV %%~f1 @pause
ArtworksCopy.vbs
A Visual Basic script used to copy internal artwork assets.
Rem 定数(ここの処理を外部設定ファイルからの読み込みにして良いかも・・・) Const Dest = "\2010Copy" Const ViewerBat = "\Viewer2010\ViewerNDEV.bat" Const ViewerBin = "\Viewer2010\bin" Const ViewerDvd = "\Viewer2010\dvdroot" Const DocumentDesign = "\Documents\design" Const Artworks = "\Sonic2010\artworks" Const Dvd = "\Sonic2010\dvd" Const DvdImage = "\Sonic2010\dvd_builder_image" Const Elf = "\Sonic2010\elf" Const ElfBat = "\Sonic2010\RVL_ElfRun.bat" Const ElfRBat = "\Sonic2010\RVL_ElfRun_R.bat" Const Plugins = "\Sonic2010\plugins" Const Tools = "\Sonic2010\tools" Rem 環境変数の取得 Dim fileStream,wshShell,src, dst, copyArray, copyfileArray Set fileStream = WScript.CreateObject("Scripting.FileSystemObject") Set wshShell = WScript.CreateObject("WScript.Shell") src = wshShell.ExpandEnvironmentStrings("%Sonic2010_ROOT%") dst = Left(src, 2) & Dest copyArray = Array(ViewerBin, ViewerDvd, DocumentDesign, Artworks, Dvd, DvdImage, Elf, Plugins, Tools) copyfileArray = Array(ViewerBat, ElfBat, ElfRBat) Rem 引数の処理 Dim IsoutPutMessage,param IsoutPutMessage = false For Each param In WScript.Arguments If StrComp(param, "Message ") Then IsoutPutMessage = true End If Next Rem メインルーチン If fileStream.FolderExists(src) = false Then WScript.Echo "環境変数Sonic2010_Rootが設定せれていません" Else Call Main() WScript.Echo "" WScript.Echo dst & "にコピー終了" End If Set wshShell = Nothing Set fileStream = Nothing Set src = Nothing Set dst = Nothing Set copyArray = Nothing Set copyfileArray = Nothing Set IsoutPutMessage = Nothing Set param = Nothing WScript.Quit 0 Rem メイン関数 Sub Main() Dim targetFolder, target Dim bat,file For Each file In copyfileArray target = src & file Set bat = fileStream.getFile(target) CopyFile(bat) Next Dim copyFolder For Each copyFolder In copyArray target = src & copyFolder Set targetFolder = fileStream.getFolder(target) Call SearchFileExceptSVN(targetFolder) If IsoutPutMessage = true Then WScript.Echo target & " コピー終了" End If Next End Sub Rem SVNファイル以外フォルダを再帰的に見てファイルを探す関数関数 Sub SearchFileExceptSVN(ByVal folder) Rem ファイルをコピーする Dim file For Each file In folder.Files Call CopyFile(file) Next Rem 再帰的に探査する Dim subFolder For Each subFolder In folder.SubFolders If StrComp(subFolder.Name, ".svn") Then Call SearchFileExceptSVN(subFolder) End If Next End Sub Rem 適切な位置にファイルをコピーする関数 Sub CopyFile(ByVal file) Dim outPut,outPutPath, len outPut = dst & Mid(file.Path, 3) outPutPath = Left(outPut, InStrRev(outPut, "\") - 1) Rem WScript.Echo outPutPath Rem フォルダーの作成 If fileStream.FolderExists(outPutPath) = false Then CreateFolder2(outPutPath) End If Rem コピー fileStream.CopyFile file.Path, outPut End Sub Rem 親込みでフォルダを生成する Sub CreateFolder2(ByVal folder) Dim parent parent = fileStream.GetParentFolderName(folder) If fileStream.FolderExists(parent) = false Then CreateFolder2(parent) End If fileStream.CreateFolder(folder) End Sub
BBATool.exe
To do: Tends to crash, fix if possible. |
A TV connector tool developed by both Nintendo and Sega.
binarc.exe
Binary archiving tool for source scripting files, common output is an ORC file. Command-line parameters are the following:
-i インクルードパス指定(複数指定可能) -l Little Endianで出力 -b Big Endianで出力(デフォルト) -align データセクションのアラインメントを指定(default=32) -ptrsize ポインタサイズ指定(default=4)
CircuitListCnv.exe
Converts circuit_list.xml to a SRC file. Running the program shows general info:
CircuitListConverter Usage:CircuitListCnv.exe <入力ファイル名> <出力ファイル> 何かあったら志村までご連絡下さい。
cri/
The directory has a variety of common CriWare tools.
CsbFileViewer.exe
A tool for viewing CSB files.
CsbFileViewer_NDEV.elf
A port of the tool for Wii.
CsbFileViewer_NDEV.ddf
;------------------------------- ; [Input] Section ; ; DvdRoot="<Root Directory>" ; The name of the directory containing files to be emulated. ; A table for the FST file is generated by retrieving files under the ; directory specified here. ; LDRFileName="<LDR File Name>" ; The name of the Application Loader file. ; BI2FileName="<BI2 File Name>" ; ; [Input] DvdRoot="$(SONIC2010_ROOT)\Sonic2010\dvd_builder_image\sonic2010\sound"
CriCsvConverter.exe
Takes a given folder and lists of files and subfolders to output a CSV file. The general information is listed below:
CriCsvConverter Ver.1.0.0.0 Copyright (C) 2009 SEGA t.sekiguchi Usage: file2cricsv.exe : -root="cpkにした場合のルートディレクトリ" : -compress … データの圧縮 : -out=出力名 : -nlist=検索対象外リストファイル : -view … 情報表示
Entries are in this format:
%s , \t%s\t\t,%i, %s, %s, %s
The first string is the file path, the second is the file name without it, the number is the index starting from 0, the next string is either "UnCompress" or "Compress" which appears on all entries if -compress is used, the other strings are unknown.
darch.exe
To do: If possible, find the differences of the modified tool. |
Common NW4R tool for archiving content, but modified by Sekiguchi.
Revolution Archiver(custom version) Ver.1.04 t.sekiguchi
DistortionConv.exe
To do: todo |
A tool converting a distortion XML to SRC.
Distortion covert tool for Sonic2010 Version 0.1.1 (Jun 25 2010-20:32:27)) Copyright (C) 2009, SEGA Corp. DistortionConv [options] <input_files or input_folders> -o output Specify output file or folder. -f file Specify input file list. -n, --nologo Don't display logo message. -h, --help Display this help and exit. -v, --version Display version information and exit. Report bugs to <kamai_masayoshi@sega.co.jp>
EventConv.exe
Converts ev_seq xml files to source event sequence files (.src).
EventConv Ver.1.1 t.sekiguchi Usage: EventConv.exe : -i=入力ファイル名 : -o=出力フォルダ名
FogConv.exe
To do: todo |
A tool to convert the Fog XML to SRC.
Fog covert tool for Sonic2010 Version 0.1.3 (Feb 1 2010-11:35:59)) Copyright (C) 2009, SEGA Corp. FogConv [options] <input_files or input_folders> -o output Specify output file or folder. -f file Specify input file list. -n, --nologo Don't display logo message. -h, --help Display this help and exit. -v, --version Display version information and exit. Report bugs to <kamai_masayoshi@sega.co.jp>
FlowExListCnv/FlowExListCnv.exe
To do: todo |
Converts the FlowExList XML?
FlowListCnv.exe <入力ファイル> <出力ファイル> 入力ファイル:XML 出力ファイル:binarc形式
FlowListCnv/FlowListCnv.exe
To do: todo |
Converts the FlowList XML?
FlowListCnv.exe <入力ファイル> <出力ファイル> 入力ファイル:XML 出力ファイル:binarc形式
fontcvtr/
Has most of the Wii's development tools for converting fonts.
GetRevision/GetRevision.bat
@echo off echo リビジョン情報を取得しています... setlocal set SRC=%SONIC2010_ROOT%\Sonic2010\tools\GetRevision\Revision.h.template set DST=%SONIC2010_ROOT%\Sonic2010\build\main\src\Revision.h SubWCRev %SONIC2010_ROOT% %SRC% %DST% endlocal
GetRevision/Revision.h.template
#ifndef __REVISION_H__ #define __REVISION_H__ // 現在のシステム日時 #define __WCNOW__ "$WCNOW$" // 作業コピーのもっとも大きいリビジョン番号 #define __WCREV__ "$WCREV$" // もっとも大きいリビジョンのコミット日時 #define __WCDATE__ "$WCDATE$" // ローカルで変更があれば 1 、そうでなければ 0 #define __WCMODS__ $WCMODS?1:0$ #endif // __REVISION_H__
GismoConverter/GismoConveter.exe
To do: todo |
GismoConverter for SONIC2010 Usage:GismoConverter.exe <input file> [options] -? Display this help. -o=filename Specify output filename.
GismoBinaryMaker.exe
To do: todo |
GismoBinaryMaker for SONIC2010 Usage:GismoBinaryMaker.exe <input file> [options] -? Display this help. -o=filename Specify output filename. -f=gismo_folder Specify search gismo folder(full path)
glarecnv.exe
To do: todo |
Converts a glare XML file to SRC.
GrassConv.exe
Converts a grass XML file to SRC.
HintConv.exe
To do: todo |
hnd2collision.exe
A tool that converts HND/HNA to Havok/PhysX Collision.
LightFieldConv.exe
To do: todo |
LocalLightConv.exe
To do: todo |
MakeStageToken.exe
To do: todo |
MiiDataImport/
Has files for importing Mii data and testing on a development console.
nw4r_matimport/nw4r_matimport.exe
A material importer. Despite what this sounds like, it's not from the Wii SDK, but Colors.
nw4r_matimport/readme.txt
========================================================================== マテリアルインポートツール Ver. 0.2.2 07/07/2009 =========================================================================== *目次 - イントロダクション - 使用方法 - 注意事項 ========================================================================== イントロダクション ========================================================================== NintendoWare for Revolution(以下NW4R)エクスポートプラグインを使って出力した、 中間モデルデータファイル(rmdlファイル)をNW4R 3Deditorから出力する事ができる マテリアル情報ファイル(r3mtファイル)から得られる情報を元に半自動的に書き換える ツールです。 書き換える対象のrmdlファイル、またはrmdlファイルが格納されているフォルダを 必ず指定する必要が有ります。 フォルダを指定した場合には、そのフォルダ以下を再帰的に検索します (拡張子が rmdl 以外のファイルは無視されます)。 本ツールはマテリアル名に埋め込まれたプリセットキー情報を元に、対応する マテリアル情報ファイルをインポートします。 ========================================================================== 使用方法 ========================================================================== 処理したい rmdl ファイル または複数の rmdl ファイルを格納したフォルダを 同梱の run.bat バッチファイルにドラッグ&ドロップすると、処理後の rmdl ファイルが元のファイルと同じフォルダに生成されます。 バッチファイルを直接実行した場合には、in_rmdl フォルダ以下の rmdl ファイルを 一括変換し、out_rrmdl フォルダに生成します。 ========================================================================== 注意事項 ========================================================================== 本ツールはまだいくつかの不具合が残っている可能性があります。
nw4r_matimport/run.bat
@echo off rem ********************************************************** rem * マテリアルインポートツール rem ********************************************************** rem ********************************************************** rem * rem * 不具合があるならここのパス指定を変更してください rem * rem ********************************************************** set NW4R_MATIMPORT= set INPUT_RMDL=in_rmdl set OUTPUT_RMDL=out_rmdl set R3MT_ROOT=..\..\artworks\material set ERROR_TXT=error.txt %~d0 cd %~dp0 if "%~1"=="" goto ALL rem ***************************************** rem * 指定パス以下を全処理 rem ***************************************** :LOOP_TOP if "%~1"=="" goto END nw4r_matimport.exe --sonic2010-opts --volume-culling on --import-r3mt "%R3MT_ROOT%" -o "%~1" "%~1" 2> %ERROR_TXT% if ERRORLEVEL 1 goto ERROR shift goto LOOP_TOP rem ***************************************** rem * 入力されたパスを全処理 rem ***************************************** :ALL nw4r_matimport.exe --sonic2010-opts --volume-culling on --import-r3mt "%R3MT_ROOT%" -o "%OUTPUT_RMDL%" "%INPUT_RMDL%" 2> %ERROR_TXT% if ERRORLEVEL 1 goto ERROR goto END :ERROR echo エラーが発生しました echo カレントフォルダに作成された %ERROR_TXT% を釜井の方まで提出してください。 goto END :END type %ERROR_TXT% pause
nw4r_texinfo.exe
To do: todo |
A texture information tool. Despite what this sounds like, it's not from the Wii SDK, but Colors.
nw4r_texmipmap/nw4r_texmipmap.exe
To do: todo |
A mipmap TGA converter of some sort. Despite what this sounds like, it's not from the Wii SDK, but Colors.
nw4r_texmipmap/readme.txt
========================================================================== ミップマップ生成ツール Ver. 0.1.7 06/22/2009 =========================================================================== *目次 - イントロダクション - 使用方法 - 既知の問題点 - 注意事項 ========================================================================== イントロダクション ========================================================================== TGA形式の画像ファイルに対して、TGA拡張領域にNintendoWare用ミップマップデータを 作成するツールです。 ========================================================================== 使用方法 ========================================================================== ミップマップを生成したいTGAファイル、または複数のTGAファイルを格納した フォルダを同梱のバッチファイルにドラッグ&ドロップすると、 ミップマップ情報が追加された中間TGAファイルが out_tga フォルダ以下に、 rtexファイルが out_rtex フォルダフォルダ以下に生成されます。 バッチファイルを直接実行した場合には、out_tga フォルダ以下のTGAファイルを 一括変換し、rtexファイルを out_rtex フォルダ以下に生成します。 バッチファイルを開いてオプション項目を変更することで、 1.出力フォルダ 2.ミップレベル を変更することができます。 各バッチファイルと画像フォーマットの対応は以下のようになります。 ・16段階インテンシティ (I4) --> run_i4.bat ・256段階インテンシティ (I8) --> run_i8.bat ・16段階インテンシティアルファ (IA4) --> run_ia4.bat ・256段階インテンシティアルファ (IA8) --> run_ia8.bat ・16ビットRGB (RGB565) --> run_rgb565.bat ・16ビットRGBA (RGB5a5) --> run_rgb5a3.bat ・32ビットRGBA (RGBA8) --> run_rgba8.bat ・圧縮テクスチャ (CMPR) --> run_cmpr.bat ・おまかせ --> run.bat *注 run.bat を使用しておまかせ変換を実行した場合、以下の条件でミップマップを作成する際の フォーマットが決定します。 1.既にTGAファイルにフォーマット情報が記録されている場合はそのフォーマットを使用する。 2.フォーマット情報がない場合は、αチャンネルの有無で rgb565 又は rgb5a3 のどちらかを選択する。 NintendoWare用Photoshopプラグインなどから出力したTGAファイルなどは、既に フォーマット情報が埋め込まれているので、おまかせ変換の方が良いかもしれません。 ========================================================================== 既知の問題点 ========================================================================== 1.おまかせ変換以外でミップマップを生成した場合、既にプラグイン等でフォーマットや ミップマップ情報が追加されているTGAファイルを入力した場合でも、強制的に上書きしてしまいます。 2.パレット形式フォーマット c4 c8 c14 には対応していません。 ========================================================================== 注意事項 ========================================================================== 本ツールはまだいくつかの不具合が残っている可能性があります。
nw4r_texmipmap/run.bat
@echo off rem ********************************************************** rem * 自動ミップマップ生成ツール rem ********************************************************** rem ********************************************************** rem * rem * TGAファイル出力フォルダ rem * rem ********************************************************** set OUTPUT_TGA=out_tga rem ********************************************************** rem * rem * rtexファイル出力フォルダ rem * rem ********************************************************** set OUTPUT_RTEX=out_rtex rem ********************************************************** rem * rem * ミップレベル(0指定で生成可能最大レベルまで生成) rem * rem ********************************************************** set LEVEL=0 rem ********************************************************** rem * ここから処理 rem ********************************************************** %~d0 cd %~dp0 pushd "%OUTPUT_RTEX%" del /f /q *.rtex popd del /f /q error.txt if "%~1"=="" goto ALL pushd "%OUTPUT_TGA%" del /q *.tga popd :LOOP_TOP if "%~1"=="" goto NEXT nw4r_texmipmap.exe --verbose -l %LEVEL% --overwrite -o "%OUTPUT_TGA%" "%~1" 2>> error.txt if ERRORLEVEL 1 goto ERROR_MIPMAP shift goto LOOP_TOP :NEXT %NW4R_ROOT%\CommandLineTools\bin\nw4r_texcvtr.exe -o "%OUTPUT_RTEX%" "%OUTPUT_TGA%" if ERRORLEVEL 1 goto ERROR_TEXCONV goto END :ALL nw4r_texmipmap.exe --verbose -l %LEVEL% --overwrite -o "%OUTPUT_TGA%" "%OUTPUT_TGA%" 2>> error.txt if ERRORLEVEL 1 goto ERROR_MIPMAP "%NW4R_ROOT%\CommandLineTools\bin\nw4r_texcvtr.exe" -o "%OUTPUT_RTEX%" "%OUTPUT_TGA%" if ERRORLEVEL 1 goto ERROR_TEXCONV goto END :ERROR_MIPMAP echo ミップマップ作成に失敗しました。 echo カレントフォルダにある error.txt を釜井の方まで提出してください。 goto END :ERROR_TEXCONV echo rtexファイル作成に失敗しました。 goto END :END pause
PathConverter.exe
Converts Stage Guide Path XML files to SRC.
PathPhysXConverter.exe
Converts PhysX Stage Guide Path XML files to SRC.
PlayerPosition/player_position_wii.exe
To do: todo |
setcvtr.exe
Converts SET XML files to SRC.
SetParticleListCnv.exe
Converts SET Particle List XML files to SRC.
SetSoundListCnv.exe
Converts SET Sound List XML files to SRC.
SoundCurveCnv.exe
Converts curve_table to a SRC file.
StaffConv.exe
Converts the staff script when using staffroll.xml and staffroll_scr.xml, outputting a source script file (.src).
StgMapConverter.exe
Converts MAP files to SRC (and also archives?).
TexConv.exe
Generic texture conversion tool from the Wii SDK.
xTextViewer/xTextViewer.exe
A localization tool previously from Sega's GE1 department. It converts text from source files (XML) to compiled (XTB) text files for the game. The tool also has a GUI, providing support for viewing of both formats, as well as command-line arguments but it is recommended to create folders as the tool doesn't support creating them that way:
/finish - Closes the tool after the task is successful. /output - Output folder, must be used with ":" /input - Input XML file, must be used with ":" /check - Immediately closes the program.