Multiselect ListではSelection Listと違い、複数列を作れないので
行にある文字列を取得してから、の部分を調整する
WorldBuilder.ltpの技術の研究済み/未研究の切り替えに使うMultiselect Listを
右クリックからEdit選択で内容を見ると、4つ項目に分かれている
Name: | リストの名前 |
Popolate List | リストの項目の内容。全技術のデータの表示と プレイヤーがその技術を取得してるかでリストの選択済み/未選択を分けている |
On Selected: | リストの行を選択した際の挙動 行の文章を取得して、同名の項目を研究済みにする |
On Deselected: | リストの行を選択を解除した際の挙動 行の文章を取得して、同名の項目を未研究にする |
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"];)
という流れの後に、指定した技術を研究済みに切り替えている
つまりリストに表示されている文字列から、切り替えたい技術に辿りつけばいい
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名には使われない、空白(スペース)を使って日本語表示と区切る
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_ を合成するようにする
string.format( "%02d", tech.Index ) .. "|" .. Locale.Lookup(tech.Name);
| もそうそう使われることはないので区切り文字として使い
左側にはインデックス番号を使い、インデックスで技術を取得させる
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