If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!

Sonic Colors: Ultimate/Development Leftovers

From The Cutting Room Floor
Jump to navigation Jump to search

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

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.png 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.png Download Sonic Colors: Ultimate (Nintendo Switch) Perforce Cache Log
File: SonicColorsUltimate_P4CacheLog.zip (140 KB) (info)


Godot Project File

Hmmm...
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
Hmmm...
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(" &AMP; ", " & ")
        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

Hmmm...
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

Hmmm...
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

Hmmm...
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

Hmmm...
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

Hmmm...
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

Hmmm...
To do:
todo

Converts the FlowExList XML?

FlowListCnv.exe <入力ファイル> <出力ファイル>
入力ファイル:XML
出力ファイル:binarc形式

FlowListCnv/FlowListCnv.exe

Hmmm...
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

Hmmm...
To do:
todo
GismoConverter for SONIC2010

Usage:GismoConverter.exe <input file> [options]

  -?              Display this help.

  -o=filename     Specify output filename.

GismoBinaryMaker.exe

Hmmm...
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

Hmmm...
To do:
todo

Converts a glare XML file to SRC.

GrassConv.exe

Converts a grass XML file to SRC.

HintConv.exe

Hmmm...
To do:
todo

hnd2collision.exe

A tool that converts HND/HNA to Havok/PhysX Collision.

LightFieldConv.exe

Hmmm...
To do:
todo

LocalLightConv.exe

Hmmm...
To do:
todo

MakeStageToken.exe

Hmmm...
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

Hmmm...
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

Hmmm...
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

Hmmm...
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.