This page details one or more prototype versions of Nintendo Labo Toy-Con 01: Variety Kit.
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?' |
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 () return debug.getinfo(2,'S').source end
function () return debug.getinfo(2, 'l').currentline end
\DebugUnderPilot\PlayMtr\#
|
|
'...But what does it mean?' |
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: |
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: |
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.