Proto:Nintendo Labo Toy-Con 01: Variety Kit
This page details one or more prototype versions of Nintendo Labo Toy-Con 01: Variety Kit.
To do: Uncompiled Lua script! Debug Menu! Executable strings: https://gist.github.com/LolHacksRule/42ced59f508b6f06e66c2f6dc8f74c75#file-nintendo-labo-pilot-executable-strings yay! |
This page or section has one or more broken YouTube links. Please find an archived version of the video(s) or a suitable replacement. |
A pre-final build of everyone's favorite cardboard-folding game, dated February 2, 2018.
Contents
Sub-Pages
To do:
|
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.
RC Car Instructions |
Fishing Rod Instructions, Part 1 |
Fishing Rod Instructions, Part 2 |
Fishing Rod Instructions, Part 3 |
House Instructions, Part 1 |
House Instructions, Part 2 |
House Instructions, Part 3 |
Motorbike Instructions, Part 1 |
Motorbike Instructions, Part 2 |
Motorbike Instructions, Part 3 |
Piano Instructions, Part 1 |
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
...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\
...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.
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
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
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.