見出し画像

【0064】アイテム画面④

いつになったら薬草を拾えるのでしょうか。

アイテム周りの機能だけは設計書でも作ろうかというくらい
いろんな要素が入ってきてて、
最低限の形になるまでの道のりだけでも遠いです。

えーっと、前回は、ああ
アイテム名が固定だった頃の名残で
アイテム名の後に入る空白の数も固定になってて表示が崩れる
でしたっけね。

psnItemList=(1 2 3)

for i in "${psnItemList[@]}"
do
   args=($(echo "${TBL_ITM_INFO[${psnItemList[i-1]}]}"|xargs))
   itemName1="${args[3]}"
   itemName2="${args[4]}"
   itemExplain="${args[5]}"
   lnSeed[i+2]="${lnSeed[i+3]:0:4}$itemName1$itemName2"'             |'"$itemExplain${lnSeed[i+2]:38}$i|"
done

なんかこんな感じになってるんでしたね。

すみません、間違ってますね。
「+01」とかの文言が入ってません。

画像1

正しくはこうですね


for i in "${psnItemList[@]}"
do
   args=($(echo "${TBL_ITM_INFO[${psnItemList[i-1]}]}"|xargs))
   itemCrrct="${args[2]}"<<<<<<<<追加
   itemName1="${args[3]}"
   itemName2="${args[4]}"
   itemExplain="${args[5]}"

   lnSeed[i+2]="${lnSeed[i+3]:0:4}$itemCrrct$itemName1$itemName2"'             |'"$itemExplain${lnSeed[i+2]:38}$i|"
                                  ^^^^^^^^^^追加
done

画像2

はい。で。

lnSeed[i+2]="${lnSeed[i+3]:0:4}$itemCrrct$itemName1$itemName2"'             |'"$itemExplain${lnSeed[i+2]:38}$i|"

のところが空白個数が固定になってる。
ので、空白の個数を変動させます。

メッセージウィンドウで使ったのと同じ方法にします。

アイテム名の長さ最長と、アイテム説明の最長を少し調整した上で、
こんな感じに。

psnItemList=(1 2 3)

for i in "${psnItemList[@]}"
do
	args=($(echo "${TBL_ITM_INFO[${psnItemList[i-1]}]}"|xargs))
	itemCrrct="${args[2]}"
	itemName1="${args[3]}"
	itemName2="${args[4]}"
	itemExplain="${args[5]}"

	spCnt1=$(( ( 24 - (${#itemCrrct}+${#itemName1}+${#itemName2}) )*2 +2 ))
	spCnt2=$(( ( 23 - ${#itemExplain} )*2 ))

	lnSeed[i+2]="${lnSeed[i+3]:0:4}$itemCrrct$itemName1$itemName2`printf %${spCnt1}s`|$itemExplain`printf %${spCnt2}s`|`printf "%2s" $i`|"
done
lnSeed[i+2]="${lnSeed[i+3]:0:4}$itemCrrct$itemName1$itemName2`printf %${spCnt1}s`|$itemExplain`printf %${spCnt2}s`|`printf "%2s" $i`|"

アイテム名の欄は
・’+99’みたいな固定3桁
・’永遠亭謹製の’みたいな最大11文字
・’おくすり’みたいな最大10文字
の最大24文字が格納される想定です。

また、アイテム説明欄には最大23文字が格納される想定です。

そこから計算して、
文字列の後にパディングされる半角スペースの数を得ます。

spCnt1=$(( ( 24 - (${#itemCrrct}+${#itemName1}+${#itemName2}) )*2 ))
spCnt2=$(( ( 23 - ${#itemExplain} )*2 ))

なので、
↑のように、最大文字数から表示するべき文字数を引いて計算しました。

spCnt1はアイテム名の後から区切りの’|’まで
spCnt2はアイテム説明の後ろから末尾の'|'までのスペース数です。

×2しているのは、
末尾に格納されるスペースはすべて半角にする想定だからです。

メッセージウィンドウのときにも引っかかりましたが
要素数展開(${#変数名}のやつ、つまり文字数)を文字列に適用する場合、
全角半角関わらず1文字は1としてカウントされます

だから最大値24はそのままの数で、パディング数は倍になるわけですね。
わかりづらい。

lnSeed[i+2]="${lnSeed[i+3]:0:4}$itemCrrct$itemName1$itemName2`printf %${spCnt1}s`|$itemExplain`printf %${spCnt2}s`|`printf "%2s" $i`|"

というわけでこうなりました。

`printf %${spCnt1}s`

っていうやつがどうにも見た目汚くて好きくなれないんですが、
仕方ありません。

実行してみます。

画像3

よさそうです。

これでアイテムを持っている前提なら
持ち物リストを表示することができるようになりました…か?

実はまだ見落としがありまして。

今現在アイテムマスタは

: 'アイテムマスタ' && { #暫定 
##アイテムマスタはn個の半角スペースで区切られた要素で構成される。
##各要素に半角スペースを含めることはできない(区切れてしまうので)。
##あくまでも暫定なのでもうちょっとちゃんとした形に変わるかも。
###アイテムIDは0000~FFFFとする。

declare -g -a TBL_ITM_INFO=()
#   0    1   2   3                     4                   5
#   ID   CAT CRR 修飾_全角11文字        名称_全角10文字     説明_全角23文字 #TBL_ITM_INFO +=('FFFF CSM +00 12345678901 1234567890 12345678901234567890123')
TBL_ITM_INFO+=('0000 CSM 000 nomod                 八卦炉               激しくマーライオンする'                      )
TBL_ITM_INFO+=('0001 CSM 000 永遠亭謹製の           おくすり             あなたはもう死ねなくなる'                    )
TBL_ITM_INFO+=('0002 CSM +02 紅魔館メイド手製の     毒弁当               瀟洒!'                                      )
TBL_ITM_INFO+=('0003 CSM +01 魔法の森でとれた       キノコ               エッチな形をしている+1'                    )
TBL_ITM_INFO+=('0004 CSM +02 魔法の森でとれた       キノコ               エッチな形をしている+2'                    )
TBL_ITM_INFO+=('0005 CSM +03 nomod                 キノコ               エッチな形をしている+3'                    )
TBL_ITM_INFO+=('0006 CSM +04 魔法の森でとれた       キノコ               エッチな形をしている+4'                    )
TBL_ITM_INFO+=('0007 CSM -10 アロマ臭のする         陰陽玉               いいにおいがする。霊夢愛用。'                )
TBL_ITM_INFO+=('0008 CSM 000 七色に光る             壊れた人形           血がついている'                              )
TBL_ITM_INFO+=('0009 CSM 000 nomod                 宝塔                 おでん'                                      )

 #エラーアイテム 
TBL_ITM_INFO+=('ZZZZ ERR +99 該当アイテムなし       該当アイテムなし     該当IDのアイテムは登録されていません')

こういう形でデータを格納しています。

頭の0000から始まるのがアイテムIDの想定で、
今のところ順番通りに並んでいます。
ただ、今後メンテナンスとかで

TBL_ITM_INFO+=('0000 CSM 000 nomod                 八卦炉               激しくマーライオンする'                      )
TBL_ITM_INFO+=('0002 CSM +02 紅魔館メイド手製の     毒弁当               瀟洒!'                                      )
TBL_ITM_INFO+=('0001 CSM 000 永遠亭謹製の           おくすり             あなたはもう死ねなくなる'                    )
TBL_ITM_INFO+=('0003 CSM +01 魔法の森でとれた       キノコ               エッチな形をしている+1'                    )

とかなることは容易に想像がつきます。

そういう状態になった上では
アイテムID=0001を取得するのに
TBL_ITM_INFO[1]を取得してはいけないわけです。
(上例ではTBL_ITM_INFO[1]にはアイテムID=0002のアイテムが入っている)

じゃあアイテムIDをちゃんと要素数にして

TBL_ITM_INFO[0]=('CSM 000 nomod                 八卦炉               激しくマーライオンする'                      )
TBL_ITM_INFO[1]=('CSM +02 紅魔館メイド手製の     毒弁当               瀟洒!'                                      )
TBL_ITM_INFO[2]=('CSM 000 永遠亭謹製の           おくすり             あなたはもう死ねなくなる'                    )
TBL_ITM_INFO[3]=('CSM +01 魔法の森でとれた       キノコ               エッチな形をしている+1'                    )

とかやればいいんですけど、
今度それはそれで
武器とか消耗品みたいなカテゴリごとにコード帯を分離するとき
抜け番とかを作りづらい(抜けによって存在しない番号も確保される)。

かと言ってカテゴリごとにマスタを分離すると
アイテムIDからアイテムの情報を取得するのに複数のマスタを参照する必要が出てくるなど困ったことも起こりそうです。

なので、アイテムIDからアイテム情報を取得するのに、
TBL_ITM_INFOの要素数を指して取るのではなく、
きちんとアイテムID項目と一致しているかで確認するように
ループでなめる方が良いです。
この方法では性能問題があるので、どこかで引き返すかもしれませんが…

次はその点を作り込むことにします。

この記事が気に入ったらサポートをしてみませんか?