【0065】アイテム画面を作る⑤
前回の残課題
「アイテムIDとアイテムマスタの添字が一致しないケース」
に対処すべく
アイテムIDを持ってアイテムマスタの要素をなめるという処理を作ります。
…の前にですね。
例えば「+3中古品の八卦炉」っていうアイテムがあったとして
補正値が「+03」
修飾子が「中古品の」
名称が「八卦炉」
という場合であっても、
ゲーム中は逐一必ず「+3中古品の八卦炉」って表記になるべきですよね。
何が言いたいかって言うと、
アイテムIDを渡すと、
補正値が「+03」
修飾子が「中古品の」
名称が「八卦炉」
を結合した
「+3中古品の八卦炉」
を一発で返してくれる仕組みが欲しいわけです。
あるいは、アイテムIDを渡すと説明が取得できるという機能もほしい。
思うところがあるので、そっちを先に作ってしまいます。
###########################################
##getItemDisp
## アイテムの表示を編集して標準出力で返却する。
## $1:表示区分(0:名称/1:説明)
## $2:アイテムID
###########################################
function getItemDisp(){
##引数の個数
if [ $# -ne 2 ] ; then
sysOut 'e' $LINENO '引数は2つ指定してください。'
return
fi
declare mode=$1
declare itemId=$2
declare retStr=''
declare args=()
args=($(echo "$(getItemInfo $itemID)"|xargs))
case $mode in
'0')
if [ "${args[1]}" = 'ERR' ] ; then
retStr="エラーアイテム:ID:${args[0]}"
else
#補正値が000の時、名称に含めない
if [ "${args[2]}" = '000' ] ; then
retStr=' '
else
retStr="${args[2]}"
fi
#補正値が000の時、名称に含めない
if [ "${args[3]}" != 'nomod' ] ; then
retStr="$retStr${args[3]}"
fi
retStr="$retStr${args[4]}"
fi
;;
'1')
retStr="$retStr${args[5]}"
;;
esac
echo "$retStr"
}
もう作っちゃったんであれですが。
引数で渡されるアイテムIDでアイテムマスタをなめて
・アイテム名称…補正値+修飾子+名称 を返却する
・アイテム説明文
のどちらかを返す関数です。
どっちを返すのかも引数で受け取ります。
また、以前のエントリで触れたとおり
アイテムマスタ上に空白のみの要素を作成できない苦しみを抱えているので
アイテムマスタ上
・補正値なしは、000として格納されている
・修飾子なしは、nomodとして格納されている
という仕様になっています。
これを表示時にはきちんと補正なしとか修飾子なしにするため、
それらの条件に会うときは文字列結合対象から外すようにしています。
さて、見慣れない関数があります。
args=($(echo "$(getItemInfo $itemID)"|xargs))
^^^^^^^^^^^
アイテムIDを渡してなんかもらう関数です。
これが、このエントリで当初言及していた
「アイテムIDを渡すと、アイテムマスタをなめて正しい情報を返す」
関数です。
アイテムIDを渡すとアイテムの表示内容を返却する関数は
その内部で正しいアイテム情報を取得する関数を発行することで
正しい表示内容を返す想定になっています。
が、この中身はまだ出来ていないのでスタブとして
下記のようにしてしまいます。
#args=($(echo "$(getItemInfo $itemID)"|xargs))
args=($(echo '0000 CSM 000 nomod 八卦炉 激しくマーライオンする'|xargs))
一旦アイテムID:0の「八卦炉」の情報(表示名か説明)を
固定で返却するようにします。
そんで、大本のところに戻ります。
所持アイテム一覧画面の表示をこのようにします。
for ((i=0; i<${#psnItemList[*]}; i++)) {
#アイテム情報取得関数
itemID=${psnItemList[i]}
itemName="$(getItemDisp 0 $itemID)"
itemExplain="$(getItemDisp 1 $itemID)"
spCnt1=$(( (24-(${#itemName}))*2 ))
spCnt2=$(( (23-${#itemExplain})*2 ))
eval 'lnSeed[i+3]="${lnSeed[i+3]:0:4}'"$itemName"'`printf %${spCnt1}s`|$itemExplain`printf %${spCnt2}s`|`printf "%2s" $i`|"'
}
…このループはイテレータでやってたんですけど、
なんかうまく回らなくなったので
要素数カウントでループするように変えました。
理由がわからなくてもやもやしますが、動くコードが正義です…。
まあそれはともかくとして、新設した「getItemDisp」関数を呼んでいます。
引数0で名称を
引数1で説明を
今は一旦、
'0000 CSM 000 nomod 八卦炉 激しくマーライオンする'
の固定値を元に取得しています。
実行してみます。
「八卦炉」固定値にしちゃったのでいいのか悪いのかわかりませんが…
一旦動いてるということで良しとします。
次回は
#args=($(echo "$(getItemInfo $itemID)"|xargs))
args=($(echo '0000 CSM 000 nomod 八卦炉 激しくマーライオンする'|xargs))
の上を動かせるように
アイテムIDから正しいアイテム情報を取得する
「getItemInfo」関数を作りこんで行きます。