日本語リスト(Multiselect List)

Multiselect ListではSelection Listと違い、複数列を作れないので
行にある文字列を取得してから、の部分を調整する

例)技術研究のMultiselect List

Multiselect Listの中身

WorldBuilder.ltpの技術の研究済み/未研究の切り替えに使うMultiselect Listを
右クリックからEdit選択で内容を見ると、4つ項目に分かれている

Name: リストの名前
Popolate List リストの項目の内容。全技術のデータの表示と
プレイヤーがその技術を取得してるかでリストの選択済み/未選択を分けている
On Selected: リストの行を選択した際の挙動
行の文章を取得して、同名の項目を研究済みにする
On Deselected: リストの行を選択を解除した際の挙動
行の文章を取得して、同名の項目を未研究にする

選択時の流れ

On Selected:
function(selection)
	local player = GetSelectedPlayer();
	if (player ~= nil) then
		-- Searching by the type name, change back to the full text key and look for it.
		local techType = "TECH_" .. tostring(selection);

		local tech = GameInfo.Technologies[techType];
		if (tech ~= nil) then
			WorldBuilder.PlayerManager():SetPlayerHasTech(player:GetID(), tech.Index, true);
		end
	end
end

On Selected:ではselectionの部分に、リストから選択した行のテキストが入り

選択した行の、文字列を取得
(例:ADVANCED_AI)


取得した文字列に頭に TECH_ を合成
(例:TECH_ADVANCED_AI)


合成して出来た文字列と同名の、Type名の技術を取得
(例:GameInfo.Technologies["TECH_ADVANCED_AI"];)

という流れの後に、指定した技術を研究済みに切り替えている

つまりリストに表示されている文字列から、切り替えたい技術に辿りつけばいい

例1: Type名 + 空白 + 日本語

リストの記述

string.gsub( tech.TechnologyType, "TECH_", "" ) .. " " .. Locale.Lookup(tech.Name);

function()
	local listItems = {};
	local player = GetSelectedPlayer();
	if (player ~= nil) then
		local playerTechs = player:GetTechs();
		local ID = 0;

		if playerTechs == nil then return; end

		for tech in GameInfo.Technologies() do
			local item = {};
			item["Text"] = string.gsub(tech.TechnologyType, "TECH_", "") .. " " .. Locale.Lookup(tech.Name);
			if (playerTechs:HasTech(tech.Index)) then
				item["Selected"] = true;
			else
				item["Selected"] = false;
			end
			ID = ID + 1;

			listItems[ID] = item;
		end
	end
	return listItems;
end

内容

Type名には使われない、空白(スペース)を使って日本語表示と区切る

On Selected:
function(selection)
	local player = GetSelectedPlayer();
	if (player ~= nil) then
		-- Searching by the type name, change back to the full text key and look for it.
		local techType = "TECH_" .. string.match(selection, '[^ ]*');

		local tech = GameInfo.Technologies[techType];
		if (tech ~= nil) then
			WorldBuilder.PlayerManager():SetPlayerHasTech(player:GetID(), tech.Index, true);
		end
	end
end

リストの文字列の「最初から半角スペースまで」を切り取り、頭に TECH_ を合成するようにする

例2: インデックス番号 + | + 日本語

リストの記述

string.format( "%02d", tech.Index ) .. "|" .. Locale.Lookup(tech.Name);

内容

| もそうそう使われることはないので区切り文字として使い
左側にはインデックス番号を使い、インデックスで技術を取得させる

On Selected:
function(selection)
	local player = GetSelectedPlayer();
	if (player ~= nil) then
		-- Searching by the type name, change back to the full text key and look for it.
		local techIndex = tonumber(string.match(selection, '[^|]*'));

		local tech = GameInfo.Technologies[techIndex];
		if (tech ~= nil) then
			WorldBuilder.PlayerManager():SetPlayerHasTech(player:GetID(), tech.Index, true);
		end
	end
end