Skip to content

Commit

Permalink
サブグループ指定ソート機能追加.
Browse files Browse the repository at this point in the history
  • Loading branch information
weizlogy committed Nov 13, 2018
1 parent 9c24c7b commit c8dea2c
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 17 deletions.
4 changes: 2 additions & 2 deletions addons.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,10 @@
"name" : "Fix Inventory Sort",
"file" : "fixinventorysort",
"extension" : "ipf",
"fileVersion" : "v1.1.0",
"fileVersion" : "v1.2.0",
"releaseTag" : "fixinventorysort",
"unicode" : "📖",
"description" : "名前でのソートを正常化します。",
"description" : "名前でのソートを正常化します。おまけ機能で好きなソート順を独自に作ることができます。",
"tags" : [
"sort",
"fix"
Expand Down
52 changes: 52 additions & 0 deletions fixinventorysort/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,57 @@
# Release Note.

## v1.2.0

### サブグループ指定ソート機能追加

アイテムのサブグループを指定して全体のソートとは別のソート順を指定できます。

#### 設定方法

機能を有効にするには以下の記述が設定ファイルに必要です。
(つまり、該当機能を使用しないのであれば書かないほうがソート処理速度に有利です。
```
s['affect'] = {}
```

##### 設定内容の説明

フォーマットは以下の通りで、カンマ区切りにより複数個指定可能です。
```
['サブグループ名'] = ソート順 , ...
```

サブグループ名は、インベントリの中項目の分類です。
例えば、ジェム(大項目:アイテム > 中項目:ジェム

ソート順は、そのサブグループ名に該当するアイテムのソート順を指定します。(そのままやん...
既存ソートを指定する場合は、'weight'など文字列で記載できます。
拡張ソートを指定する場合は、定義部分(s[])に記載した数字を記載します。(s[2]なら、2

具体例を一つ。
材料は重さ順、消費は名前順、ジェムはアイコン順にする場合は
以下のようにします。
```
local s = {}
--
s[0] = 'weight'
s[1] = 'name'
s[2] = {
Desc = 'アイコン順',
Sort = {
[0] = 'Icon',
[1] = 'Name'
}
}
s['affect'] = {
['材料'] = 'weight',
['消費'] = 'name',
['ジェム'] = 2,
}
--
return s
```

## v1.1.0

### 重さ順の処理修正
Expand Down
80 changes: 65 additions & 15 deletions fixinventorysort/fixinventorysort.lua
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ function g.new(self)
end

-- ソート処理
members.Sort = function(self, baseList)
members.Sort = function(self, baseList, useAffect)
-- INV_ITEM_SORTED_LIST型を再現(いらないんじゃないか疑惑はある
local sortWorker = {
at = function(self, index)
Expand All @@ -39,15 +39,67 @@ function g.new(self)
return #self
end
}
-- ソート対象外保管領域
local ignoreSortWorker = {}

-- データを作業ワークへコピー
-- 対象外のアイテムは専用ワーク行き
for i = 0 , baseList:size() - 1 do
local invItem = baseList:at(i)
if (invItem ~= nil) then
table.insert(sortWorker, invItem)
if (not useAffect) then
table.insert(sortWorker, invItem)
else
local baseidcls = GET_BASEID_CLS_BY_INVINDEX(invItem.invIndex)
-- CHAT_SYSTEM(GetIES(invItem:GetObject()).GroupName..' / '..baseidcls.TreeGroupCaption..' / '..baseidcls.TreeSSetTitle)
local affect = __config['affect']
local target = baseidcls.TreeSSetTitle
if (affect and affect[dictionary.ReplaceDicIDInCompStr(target)]) then
-- 対象グループ名ごとにまとめる
-- ここも再帰的呼び出しのためINV_ITEM_SORTED_LIST型を再現
ignoreSortWorker[target] = ignoreSortWorker[target] or {
at = function(self, index)
return self[index + 1]
end, -- <- カンマないと死ぬ気をつけて
size = function(self)
return #self
end
}
table.insert(ignoreSortWorker[target], invItem)
else
table.insert(sortWorker, invItem)
end
end
end
end

local sortFunc = self:ToSortFunc(__sortType)
if (sortFunc == nil) then
return baseList
end
-- ソート実行
table.sort(sortWorker, sortFunc)

-- for i = 0, 20 do
-- CHAT_SYSTEM('['..dictionary.ReplaceDicIDInCompStr(GetIES(sortWorker:at(i):GetObject()).Name)..']')
-- end

local chooseSortType = __sortType
for k, v in pairs(ignoreSortWorker) do
__sortType = self:ToSortType(__config['affect'][dictionary.ReplaceDicIDInCompStr(k)])
local sortedList = self:Sort(v)
-- CHAT_SYSTEM(k..' - '..__sortType..' - '..#sortedList)
for _, v in ipairs(sortedList) do
table.insert(sortWorker, 1, v)
end
end
__sortType = chooseSortType

return sortWorker
end

-- ソート種別からソートロジックに変換
members.ToSortFunc = function(self, type)
local sortFunc = nil
if (__sortType == 1) then
sortFunc = function(s1, s2)
Expand Down Expand Up @@ -105,17 +157,8 @@ function g.new(self)
sortFuncDynamicaly = sortFuncDynamicaly..logic
end
sortFunc = assert(loadstring(string.format(sortFuncTemplate, sortFuncDynamicaly)))()
else
return baseList
end
-- ソート実行
table.sort(sortWorker, sortFunc)

-- for i = 0, 20 do
-- CHAT_SYSTEM('['..dictionary.ReplaceDicIDInCompStr(GetIES(sortWorker:at(i):GetObject()).Name)..']')
-- end

return sortWorker
return sortFunc
end

members.CreateSortMenu = function(self)
Expand All @@ -137,10 +180,10 @@ function g.new(self)
-- 文字列だけ == 既存ロジック
-- 文字列以外 == 拡張ロジック
if (type(config) == 'string') then
scpScp = string.format("REQ_INV_SORT(%d, %d)",IT_INVENTORY, loadstring('return BY_'..config:upper())())
scpScp = string.format("REQ_INV_SORT(%d, %d)",IT_INVENTORY, self:ToSortType(config))
ui.AddContextMenuItem(context, loadstring(string.format('return ScpArgMsg("SortBy%s")', config:gsub('^%l', string.upper)))(), scpScp)
else
config.Id = i + __extendSortStartIndex -- Index値から勝手にIDを捏造
config.Id = self:ToSortType(i)
self:Dbg(config.Id..' - '..config.Desc)
scpScp = string.format("REQ_INV_SORT(%d, %d)",IT_INVENTORY, config.Id)
ui.AddContextMenuItem(context, config.Desc, scpScp)
Expand All @@ -150,6 +193,13 @@ function g.new(self)
ui.OpenContextMenu(context)
end

members.ToSortType = function(self, value)
if (type(value) == 'string') then
return loadstring('return BY_'..value:upper())()
end
return value + __extendSortStartIndex -- Index値から勝手にIDを捏造
end

-- ログ出力
members.Dbg = function(self, msg)
-- CHAT_SYSTEM(string.format('[%s] <Dbg> %s', addonName, msg))
Expand Down Expand Up @@ -197,7 +247,7 @@ function FIXINVENTORYSORT_ON_INIT(addon, frame)
g.instance.sessionGetInvItemSortedList = session.GetInvItemSortedList
end
session.GetInvItemSortedList = function()
return g.instance:Sort(g.instance.sessionGetInvItemSortedList())
return g.instance:Sort(g.instance.sessionGetInvItemSortedList(), true)
end
-- インベントリソートメニュー生成処理をフックしてカスタムソートを追加する
if (g.instance.SORT_ITEM_INVENTORY == nil) then
Expand Down

0 comments on commit c8dea2c

Please sign in to comment.