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

Proto:Nintendo Labo Toy-Con 01: Variety Kit

From The Cutting Room Floor
Jump to navigation Jump to search

This page details one or more prototype versions of Nintendo Labo Toy-Con 01: Variety Kit.

Hmmm...
To do:
Uncompiled Lua script! Debug Menu! Executable strings: https://gist.github.com/LolHacksRule/42ced59f508b6f06e66c2f6dc8f74c75#file-nintendo-labo-pilot-executable-strings yay!

A pre-final build of everyone's favorite cardboard-folding game, dated February 2, 2018.

Sub-Pages

Hmmm...
To do:
  • Translations and comparison images for everything here.
  • Are there differences between the cardboard sheets shown in the instructions here and the retail versions?

Full instruction sets can be found in the DebugUnderPilot directory, albeit in JPG format. These are replaced with 3D models and a slick UI in the final version. Across all of the sub-pages below, there is a grand total of 4,730 images.


Nintendo-Labo-Var-Proto-RcnMain 0001 JPja.JPG
RC Car Instructions
Nintendo-Labo-Var-Proto-FshMain 0001 JPja.JPG
Fishing Rod Instructions, Part 1
Nintendo-Labo-Var-Proto-FshMain 0001 JPja.JPG
Fishing Rod Instructions, Part 2
Nintendo-Labo-Var-Proto-FshMain 0001 JPja.JPG
Fishing Rod Instructions, Part 3
Nintendo-Labo-Var-Proto-HusMain 0001 JPja.JPG
House Instructions, Part 1
Nintendo-Labo-Var-Proto-HusMain 0001 JPja.JPG
House Instructions, Part 2
Nintendo-Labo-Var-Proto-HusMain 0001 JPja.JPG
House Instructions, Part 3
Nintendo-Labo-Var-Proto-MbkMain 0001 JPja.JPG
Motorbike Instructions, Part 1
Nintendo-Labo-Var-Proto-MbkMain 0001 JPja.JPG
Motorbike Instructions, Part 2
Nintendo-Labo-Var-Proto-MbkMain 0001 JPja.JPG
Motorbike Instructions, Part 3
Nintendo-Labo-Var-Proto-PnoMain 0001 JPja.JPG
Piano Instructions, Part 1
Nintendo-Labo-Var-Proto-PnoMain 0001 JPja.JPG
Piano Instructions, Part 2


Text

According to \DebugUnderPilot\BuildDate.txt, this build is from Feb 2 2018 09:51:09.

The following text can be found in \DebugUnderPilot\HtmlPath.txt:

Test.htdocs/Learn/Pno1_ピアノToy-Conが鳴るしくみ.html
Test.htdocs/Learn/Rbt1_ロボットヘッドギアをつくろう!.html
Test.htdocs/Learn/Rbt2_片付けるまでがLABO!!.html
Test.htdocs/Learn/Rbt3_ロボットToy-Conが歩くしくみ.html

Lua Scripts

Cacti speak Japanese.
...But what does it mean?
This game has text or audio that needs to be translated. If you are fluent with this language, please read our translation guidelines and then submit a translation!

Similar to Splatoon 2's Global Testfire, the prototype has a DebugUnderPilot directory with multiple directories, one containing Lua scripts unsurprisingly called Lua, with a portion of uncompiled Lua scripts in each subfolder that are not used by the game, text in them is always encoded in UTF-8 and some have developer copyrights.

Lib/mtr_util.lua:

--------------------------------------------------------------------------------------
--[[
    @author     Kazuki Misu
    @copyright (C) Nintendo

    MTRのライブラリ。
--]]
--------------------------------------------------------------------------------------

mtr = {}

mtr.NullVehicleMode = 0;
mtr.CarMode = 1;
mtr.PlaneMode = 2;
mtr.SubmarineMode = 3;

function mtr.getVehicleModeSelectorURL()
	return "ORNode://Babel/プレイヤー/コントローラ/モード切替";
end

function mtr.warpPlayer(x, y, z)
	for mode = 0, 3 do

		if mode == 0 then
			url = [[ORNode://Babel/プレイヤー/Mtr__Frame[0]:パラメータ]];
		elseif mode == 1 then
			url = "ORNode://Babel/プレイヤー/Mtr__Car[0]:パラメータ";
		elseif mode == 2 then
			url = "ORNode://Babel/プレイヤー/Mtr__Plane[0]:パラメータ";
		else
			url = [[ORNode://Babel/プレイヤー/Mtr__Submarine[0]:パラメータ]];
		end

		HostIO.WriteMemoryF32A(url, [[デバッグ操作/ワープ/座標]], x, 0);
		HostIO.WriteMemoryF32A(url, [[デバッグ操作/ワープ/座標]], y, 1);
		HostIO.WriteMemoryF32A(url, [[デバッグ操作/ワープ/座標]], z, 2);

		HostIO.PressButton(url, [[デバッグ操作/ワープ/ワープ実行]]);
	end
end

function mtr.forceChangeToCar()

	HostIO.WriteMemoryBool(mtr.getVehicleModeSelectorURL(), "デバッグ機能/強制切替を有効化", true);
	HostIO.WriteMemoryS32(mtr.getVehicleModeSelectorURL(), "デバッグ機能/モード", mtr.CarMode);
end


Lib/patrol_util.lua:

--------------------------------------------------------------------------------------
--[[
    @author     Shinya Yano, Shota Watanabe
    @copyright (C) Nintendo

    自動巡回のためのユーティリティ
    
    以下の機能がある
    * 開始時と終了時の定型処理
    * リジューム機能
]]
--------------------------------------------------------------------------------------

-- グローバル変数
__PatrolCore = {};
__bufsize = 512

--[[
    LP2のLua表示のバッファがあふれない安全なプリント
]]
function patrolPrint( message , prompt)
	prompt = prompt or "[patrol]"
    print(prompt..message)
end

function printPatrolStatus( table )
    patrolPrint("patrol status")
    patrolPrint(string.format("resume : %s", patrolIsResumed()))

    patrolPrint(__serializeTable(__PatrolCore.arg))
    patrolPrint(__serializeTable(table))
end

--------------------------------------------------------------------------------------

function patrolBegin()
    patrolPrint("[start patrol]")
    patrolPrint("----------------------------------------")

    -- おそらくLABOの独自処理
	PatrolSystem.tryUpdateGameConfigBool("IsEnableLoopOnError", false) 

	__PatrolCore.arg = patrolLoadCoreTable();
	patrolAnnotation( "started", __convTable2Hash( { message=p_message } ) );
end

function patrolEnd()
    patrolPrint("----------------------------------------")
    patrolPrint("[finish patrol]")
	patrolAnnotation( "finished", __convTable2Hash( { succeeded=p_succeeded, message=p_message } ) );
end

----------------------------------------------------------------------

--[[
	巡回しているスクリプト側が監視するアノテーション形式にしてコンソール出力へ流します
	基本的にはシステムが使う用途なので、直接は使わないでください
]]
function patrolAnnotation( label, message )
	PatrolSystem.annotate( label, tostring(message or "") );
end

----------------------------------------------------------------------
--[[
    テストセットを持つ巡回スクリプトにおいて、DBを更新するためのアノテーションをprintします。
]]
function patrolDatabaseUpdater( dataset )
	patrolAnnotation( "db_updater", __convTable2Hash(dataset));
end

----------------------------------------------------------------------
--[[
    テストケース開始時
]]
function patrolSendTestcaseInfo( dataset )
	patrolAnnotation( "testcaseInfo", __convTable2Hash(dataset));
end

----------------------------------------------------------------------
--[[
    テストケース開始時
]]
function patrolSendTestcaseComplete( dataset )
	patrolAnnotation( "testcaseComplete", __convTable2Hash(dataset));
end

----------------------------------------------------------------------
--[[
	巡回しているスクリプトがエラー落ちなどで強制的に中断されても再実行可能なスクリプトであるか設定します
	これを設定したスクリプトはエラー落ちしても再度実行処理が入るため、再実行時は前回の処理を再開するように色々実装してください
]]
function patrolSetEnableResumable( enable )
	patrolAnnotation( "resumable", { enable=tostring(enable) } );
end
----------------------------------------------------------------------
--[[
	巡回しているスクリプトがエラー落ちなどで強制的に中断されても再実行可能なスクリプトであるか設定します
	これを設定したスクリプトはエラー落ちしても再度実行処理が入るため、再実行時は前回の処理を再開するように色々実装してください
]]
function patrolSetEnableResumable( enable )
	patrolAnnotation( "resumable", { enable=tostring(enable) } );
end

----------------------------------------------------------------------
--[[
	再実行可能なスクリプトにしても最大再実行回数は決められています
	巡回用のスクリプトで無限ループに陥るのは大損なので、あまりおおきな値を設定しないように注意してください
	デフォルト値は 1 です(再実行不可能です)
]]
function patrolSetMaxResumableCount( count ) -- duplicated
	patrolAnnotation( "maxResumableCount", __convTable2Hash( { count=count } ) );
end

----------------------------------------------------------------------
--[[
	自動巡回が再実行された回数を返します
]]
function patrolGetResumedCount()
	return ( ( __PatrolCore.arg or {} ).executeCount or 0 );
end

----------------------------------------------------------------------
--[[
	自動巡回が再実行された状態であるかを返します
]]
function patrolIsResumed()
	return ( patrolGetResumedCount() > 0 );
end
----------------------------------------------------------------------
--[[
	サーバにレコードを送信するよう要求します(実際に送信するのはPCなので)
	どういったレコードが有効か、ラベル等は全てサーバ連携なので実装依存です
]]
function patrolSendReport( label, record, opts )
	opts = opts or { setPlatform=true, setRevision=true, setTarget=true };

	if ( opts["setPlatform"] ) then
		record["platform"] = patrolGetPlatform();
	end
	if ( opts["setTarget"] ) then
		record["target"] = patrolGetTarget();
	end
	if ( opts["setRevision"] ) then
		record["revision"] = patrolGetRevision();
	end

	patrolAnnotation( label, __convTable2Hash( record ) );
end

----------------------------------------------------------------------
--[[
	実行されているROMのプラットフォーム:strを取得します
]]
function patrolGetPlatform()
	local res = PatrolSystem.getPerformanceStateInfo();
	return res["platform"];
end

----------------------------------------------------------------------
--[[
	実行されているROMのターゲット(Develop、Productなど):strを取得します
]]
function patrolGetTarget()
	local res = PatrolSystem.getPerformanceStateInfo();
	return res["target"];
end

----------------------------------------------------------------------
--[[
	実行されているROMのビルド者:strを取得します
	取得できなかった場合はnilが返ります
]]
function patrolGetBuilder()
	return ( ( __PatrolCore.arg or {} )["builder"] );
end

----------------------------------------------------------------------
--[[
	実行されているROMのリビジョン:intを取得します
	取得できなかった場合はnilが返ります
]]
function patrolGetRevision()
	local res = PatrolSystem.getPerformanceStateInfo();
	if ( (res["revision"] or 0) == 0 ) then
		return nil;
	end
	return res["revision"];
end


--------------------------------------------------------------------------------------
--[[
    テストセットのパス
]]
function patrolTestsetDir()
    return PatrolSystem.GetTestsetDir()
end

function patrolTempTableDir()
    return PatrolSystem.GetTempDir()
end
--------------------------------------------------------------------------------------
--[[
    テストセットの読み込み
]]


function patrolLoadTestset( filename )
    local path = patrolTestsetDir().."\\"..filename
    return __patrolLoadTable(path)
end



--------------------------------------------------------------------------------------
--[[
    テーブル系のシリアライズパス
]]


function patrolTempTablePath()
    return PatrolSystem.GetStateFilePath()
end

function patrolCoreTablePath()
    return PatrolSystem.GetCoreFilePath()
end


--------------------------------------------------------------------------------------

function patrolStoreTempTable( table )
    patrolPrint("storing temp table ... "..__serializeTable(table))
    local path = patrolTempTablePath()
    return __patrolStoreTable(path, table)
end

function patrolLoadTempTable()
    local path = patrolTempTablePath()
    return __patrolLoadTable(path)
end


function patrolStoreCoreTable( table )
    local path = patrolCoreTablePath()
    return __patrolStoreTable(path, table)
end

function patrolLoadCoreTable()
    local path = patrolCoreTablePath()
    return __patrolLoadTable(path)
end

--------------------------------------------------------------------------------------
--[[
    ファイル書き出し
]]
function __patrolStoreTable( filepath, table )
	if ( type(table) ~= "table" ) then
		return false;
	end

	local converted = __serializeTable(table, 0, false);
	local succeeded = PatrolSystem.StoreResFile( filepath, converted );
	return succeeded;
end

--------------------------------------------------------------------------------------
--[[
    ファイル読み込み
]]
function __patrolLoadTable( filepath )
	local defaultValue = "{}";

	local src = PatrolSystem.LoadResFile( filepath, defaultValue );
	if ( #src <= 0 ) then
		src = defaultValue;
	end
	src = "return "..src..";";
	--print( src );

	local fileFunc, errLoad = load( src );
	if ( errLoad ) then return nil; end

	local fileTable = fileFunc();

	return fileTable;
end


----------------------------------------------------------------------
--[[
	LuaTable serialization
]]
function __serializeTable( table, nest, noline )
	table = table or {};
	nest = nest or 0;
	if ( noline == nil ) then noline = true; end

	local nl = "\n";
	if ( noline ) then
		nl = "";
	end

	local lt = "";
	for i=0, nest, 1 do
		lt = lt.."   ";
	end

	local nllt = nl..lt;

	local res = "{"..nllt;
	local count = 0;

	local stringize = function( v )
		local stringized = nil;
		local typeName = type(v);

		if ( typeName == "nil" ) then
			stringized = "nil";
		elseif ( typeName == "string" ) then
			stringized = "\""..v.."\"";
		elseif ( typeName=="number" or typeName=="boolean" ) then
			stringized = tostring(v);
		elseif ( typeName == "table" ) then
			stringized = __serializeTable( v, nest+1, noline );
		end
		return stringized;
	end

    -- TODO : Arrayだったらpairsでも行けるので無くてもよさそう?
	-- for k, v in ipairs(table) do
	-- 	if ( count > 0 ) then
	-- 		res = res..","..nllt;
	-- 	end

	-- 	-- stringize each value
	-- 	local stringized = stringize( v );

	-- 	-- not undefined
	-- 	if ( stringized ~= nil ) then
	-- 		-- chain
	-- 		res = res..string.format("[%d]=%s", k, stringized);
	-- 		count = count+1;
	-- 	end
	-- end

	for k, v in pairs(table) do
		if ( count > 0 ) then
			res = res..","..nllt;
		end

		-- stringize each value
		local stringized = stringize( v );

		-- not undefined
		if ( stringized ~= nil ) then
			-- chain
			res = res..string.format("%s=%s", tostring(k), stringized);
			count = count+1;
		end
	end
	res = res..nllt.."}";
	return res;
end

----------------------------------------------------------------------
--[[
	LuaTable => Ruby Hash(yaml)
]]
function __convTable2Hash( table, nest, noline )
	table = table or {};
	nest = nest or 0;
	if ( noline == nil ) then noline = true; end

	local nl = "\n";
	if ( noline ) then
		nl = "";
	end

	local lt = "";
	for i=0, nest, 1 do
		lt = lt.."   ";
	end

	local nllt = nl..lt;

	local res = "{"..nllt;
	local count = 0;

	local stringize = function( v )
		local stringized = nil;
		local typeName = type(v);

		if ( typeName == "nil" ) then
			stringized = "nil";
		elseif ( typeName == "string" ) then
			stringized = "\""..string.gsub(v, "\\", "\\\\").."\"";
		elseif ( typeName=="number" or typeName=="boolean" ) then
			stringized = tostring(v);
		elseif ( typeName == "table" ) then
			stringized = __convTable2Hash( v, nest+1, noline );
		end
		return stringized;
	end

    -- TODO : Arrayだったらpairsでも行けるので無くてもよさそう?
	-- for k, v in ipairs(table) do
	-- 	if ( count > 0 ) then
	-- 		res = res..","..nllt;
	-- 	end

	-- 	-- stringize each value
	-- 	local stringized = stringize( v );

	-- 	-- not undefined
	-- 	if ( stringized ~= nil ) then
	-- 		-- chain
	-- 		res = res..string.format("%d : %s", k, stringized);
	-- 		count = count+1;
	-- 	end
	-- end
	for k, v in pairs(table) do
		if ( count > 0 ) then
			res = res..","..nllt;
		end

		-- stringize each value
		local stringized = stringize( v );

		-- not undefined
		if ( stringized ~= nil ) then
			-- chain
			res = res..string.format("\"%s\" : %s", tostring(k), stringized);
			count = count+1;
		end
	end
	res = res..nllt.."}";
	return res;
end

Lib/system_util.lua:

--------------------------------------------------------------------------------------
--[[
    @author     Shinya Yano, Shota Watanabe
    @copyright (C) Nintendo

    どこでも使える系のライブラリ
    waitするとか。
]]
--------------------------------------------------------------------------------------

function wait_frame(frame)
	while frame > 0 do
		frame = frame - 1;
		coroutine.yield();
	end
end

function wait_next_scene()
	while true do
		if Scene.IsEndEnter() == true and Scene.IsSceneFaderSleep() == true then
			break;
		else
			coroutine.yield();
		end
	end
end


function __FILE__() return debug.getinfo(2,'S').source end
function __LINE__() return debug.getinfo(2, 'l').currentline end


\DebugUnderPilot\PlayMtr\

Cacti speak Japanese.
...But what does it mean?
This game has text or audio that needs to be translated. If you are fluent with this language, please read our translation guidelines and then submit a translation!

A directory that contains various imagery for Nintendo Labo 03: Vehicle Kit. Contents include an aerial world map, control instructions, and a game developer who is very big into submarines.

(Source: Ehm, Simon, Reminon)

Map Compile Path

D:/home/Babel/Work/Map/SetData/Mbk_Field400x400_Set/Mbk_Field400x400_Set

Only Mbk_Field400x400_Set has a FilePath string leftover.

Debug Leftovers

Crash Game

Hmmm...
To do:
Test on a retail console and see if there's a different output.

Pressing L + R + Plus, on your controller any time after the message *** Press 'L + R + Plus' for really HALT. *** is printed in the debug console (a bit after bootup) will halt the game.

Oddities

bbak Files

Hmmm...
To do:
These files have different data...

In Param, there are three files (Hus_AttachmentMgr, Hus_NoDeviceAttachment, Hus_AttachmentMgr) with an .act extension before.bbak (BAcKup?), most likely these were uncompiled yaml files that were then compiled but forgot to be renamed internally after conversion to remove the extension.