
【0062】アイテム画面を作る②
さて、暫定的な持ち物データを作ったので、
前に作ったアイテム表示画面に持ち物データを被せてと思います。
前のときにも書きましたが、
今のところアイテム画面はこう用意されており…
: 'アイテム欄表示内' && {
##################################################
## defItemInfo
## アイテム一覧表示。レイヤー2。
## lnItemInfo[]にアイテム一覧表示内容を格納する
##################################################
function defItemInfo() {
declare -a -g lnItemInfo=()
#初期状態 0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999
#文字数 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
lnItemInfo+=('+------------------------------------------------+----------------------------------------------+--+') #00
lnItemInfo+=('| 所持品 ページ目 | 説明 |直|') #01
lnItemInfo+=('+------------------------------------------------+----------------------------------------------+--+') #02
lnItemInfo+=('| | | |') #03
lnItemInfo+=('| | | |') #04
lnItemInfo+=('| | | |') #05
lnItemInfo+=('| | | |') #06
lnItemInfo+=('| | | |') #07
lnItemInfo+=('| | | |') #08
lnItemInfo+=('| | | |') #09
lnItemInfo+=('| | | |') #10
lnItemInfo+=('| | | |') #11
lnItemInfo+=('| | | |') #12
lnItemInfo+=('| | | |') #13
lnItemInfo+=('| | | |') #14
lnItemInfo+=('| | | |') #15
lnItemInfo+=('| | | |') #16
lnItemInfo+=('| | | |') #17
lnItemInfo+=('| | | |') #18
lnItemInfo+=('+============================================+===+==============================================+==+') #19+1
}
}
それを描画するのはこうです。
: 'アイテムレイヤー結合' && {
##################################################
## joinFrameOnItem
## 画面フレームと、アイテム表示枠を結合する
## lnSeedのマップ枠の中にlnItemInfoをはめ込む。
## また、所持アイテムの情報をはめ込んでいく。
##################################################
function joinFrameOnItem (){
#現在の表示内容を退避し、アイテム枠を表示する。
##アイテム枠で上書き
for ((i = 0; i <= 19; i++)) {
lnSeed[i]="${lnItemInfo[i]}"
}
#カーソル設置
lnSeed[3]="${lnSeed[3]:0:2}>${lnSeed[3]:3}"
}
}
で、持ち物リストとしてグローバルな配列を定義しました。
## 所持アイテム格納配列
### アイテムID で保持
declare -a -g psnItemList
ここにはアイテムIDだけが登録されていく想定で、
アイテムのデータ実態はアイテムマスタ(のようなもの)を設けて
そこに登録します。
: 'アイテムマスタ' && {
#暫定
##アイテムマスタはn個の半角スペースで区切られた要素で構成される。
##各要素に半角スペースを含めることはできない(区切れてしまうので)。
##あくまでも暫定なのでもうちょっとちゃんとした形に変わるかも。
###アイテムIDは0000~FFFFとする。
declare -g -a TBL_ITM_INFO=()
# 0 1 2 3 4 5
# ID CAT CRR 修飾_全角10文字 名称_全角10文字 説明_全角22文字
#TBL_ITM_INFO+=('FFFF CSM +00 1234567890 1234567890 1234567890123456789012')
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_ERR=('ZZZZ ERR +99 該当アイテムなし 該当アイテムなし 該当IDのアイテムは登録されていません')
}
はい。
スモールステップで行きます。
: 'アイテム欄表示内' && {
##################################################
## defItemInfo
## アイテム一覧表示。レイヤー2。
## lnItemInfo[]にアイテム一覧表示内容を格納する
##################################################
function defItemInfo() {
declare -a -g lnItemInfo=()
#初期状態 0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999
#文字数 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
lnItemInfo+=('+------------------------------------------------+----------------------------------------------+--+') #00
lnItemInfo+=('| 所持品 ページ目 | 説明 |直|') #01
lnItemInfo+=('+------------------------------------------------+----------------------------------------------+--+') #02
lnItemInfo+=('| 永遠亭謹製のおくすり |あなたはもう死ねなくなる | 1|') #03
lnItemInfo+=('| | | |') #04
lnItemInfo+=('| | | |') #05
lnItemInfo+=('| | | |') #06
lnItemInfo+=('| | | |') #07
lnItemInfo+=('| | | |') #08
lnItemInfo+=('| | | |') #09
lnItemInfo+=('| | | |') #10
lnItemInfo+=('| | | |') #11
lnItemInfo+=('| | | |') #12
lnItemInfo+=('| | | |') #13
lnItemInfo+=('| | | |') #14
lnItemInfo+=('| | | |') #15
lnItemInfo+=('| | | |') #16
lnItemInfo+=('| | | |') #17
lnItemInfo+=('| | | |') #18
lnItemInfo+=('+============================================+===+==============================================+==+') #19+1
}
}
まずはこう。アイテムマスタとか完全に無視して表示だけを目指します。
まあ失敗するわけもなく。
アイテムマスタ上は
「永遠亭謹製のおくすり」は
修飾子「永遠亭謹製の」と
アイテム名「おくすり」
に分かれています。
あと、説明。
一番右の番号は「今持ってるアイテムの、上から順に項番」です。
アイテムを持っていない行には出したくないです。
左から順番に、アイテムマスタから取得するようにしましょう。
: 'アイテムレイヤー結合' && {
##################################################
## joinFrameOnItem
## 画面フレームと、アイテム表示枠を結合する
## lnSeedのマップ枠の中にlnItemInfoをはめ込む。
## また、所持アイテムの情報をはめ込んでいく。
##################################################
function joinFrameOnItem (){
#現在の表示内容を退避し、アイテム枠を表示する。
##アイテム枠で上書き
for ((i = 0; i <= 19; i++)) {
lnSeed[i]="${lnItemInfo[i]}"
}
lnSeed[3]="${lnSeed[3]:0:4}"'永遠亭謹製のおくすり '"${lnSeed[3]:25}"
#カーソル設置
lnSeed[3]="${lnSeed[3]:0:2}>${lnSeed[3]:3}"
}
}
追加業は
lnSeed[3]="${lnSeed[3]:0:4}"'永遠亭謹製のおくすり '"${lnSeed[3]:25}"
です。
アイテム枠表示時に
枠を表示したついでにアイテム情報を更に上書きする
という思想なので、
アイテムレイヤー結合関数の中でlnseed[]を塗り替えたあとで
アイテム表示行を更に上書きます。
一旦はlnseed[3]つまりアイテム表示業行の1行目に、
固定文言を流し込みました。
説明欄以降は元のデータです。
まあこれも失敗するはずがないんですが。
さて、ここにどうしましょうかということですが…。
「永遠亭のおくすり」アイテムはアイテムマスタ上は
declare -g -a TBL_ITM_INFO=()
# 0 1 2 3 4 5
# ID CAT CRR 修飾_全角10文字 名称_全角10文字 説明_全角22文字
#TBL_ITM_INFO+=('FFFF CSM +00 1234567890 1234567890 1234567890123456789012')
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' )
・…続く
なので1番目です。
2番目じゃないです、
000nomod八卦炉
(nomodの意味は今後出てくる)はアイテムidとしては0番目です。
…最近1オリジンが恋しいです、基本設計以前の業務をやってると特に。
ついでに、最初に取得しようと思う修飾子部分(「永遠亭謹製の」のとこ)は、3番目の要素ですね。
なので、
アイテムID1番のアイテム…TBL_ITM_INFO[1]の、
3要素目…はただの文字列で、スペースで区切られた3つ目です、
を取得したいと思います。
: 'アイテムレイヤー結合' && {
##################################################
## joinFrameOnItem
## 画面フレームと、アイテム表示枠を結合する
## lnSeedのマップ枠の中にlnItemInfoをはめ込む。
## また、所持アイテムの情報をはめ込んでいく。
##################################################
function joinFrameOnItem (){
#現在の表示内容を退避し、アイテム枠を表示する。
##アイテム枠で上書き
for ((i = 0; i <= 19; i++)) {
lnSeed[i]="${lnItemInfo[i]}"
}
#定義
declare args=()
declare itemName-''
#アイテムマスタの1要素目を、xargsでスペース区切りにてパース
args=($(echo "${TBL_ITM_INFO[1]}"|xargs))
#スペース区切りでパースされた各要素のうち3番目をアイテム名の一部とする
itemName1="${args[3]}"
#表示情報に注入
lnSeed[3]="${lnSeed[3]:0:4}$itemName1"'おくすり '"${lnSeed[3]:25}"
#カーソル設置
lnSeed[3]="${lnSeed[3]:0:2}>${lnSeed[3]:3}"
}
}
一旦こうなります。
#アイテムマスタの1要素目を、xargsでスペース区切りにてパース
args=($(echo "${TBL_ITM_INFO[1]}"|xargs))
前回の記事に書いた「xargs」コマンドを使用して、
TBL_ITM_INFO[]の1番目の要素
(これがアイテムID1のアイテム情報全体になる)を、
スペース区切りでバラして、
args配列に詰め直していきます。
#スペース区切りでパースされた各要素のうち3番目をアイテム名の一部とする
itemName1="${args[3]}"
そうして取り出されたアイテムID1のアイテム情報配列の
3番目の要素がアイテムの名前の一部(修飾子、と表現している部分)
になります。
#表示情報に注入
lnSeed[3]="${lnSeed[3]:0:4}$itemName1"'おくすり '"${lnSeed[3]:25}"
それを、lnSeedの表示情報に注入していきます。
上記の処理で取得される予定の「永遠亭の」の部分は除去してあります。
実行してみます。
(同じ画面になるように作ってるから当然なんだけど、
スクショ、変わんないんで意味ないですよね)
…まあ成功してます。
こんな感じでどんどん作ってきます。
declare args=()
declare itemName=''
args=($(echo "${TBL_ITM_INFO[1]}"|xargs))
itemName1="${args[3]}"
itemName2="${args[4]}"
itemExplain="${args[5]}"
lnSeed[3]="${lnSeed[3]:0:4}$itemName1$itemName2"' |'"$itemExplain${lnSeed[3]:41}"
とりあえずこう。
修飾子に加えて、アイテム名称と、アイテム説明欄を取得して、
表示情報に注入します。
…スクショいります?
成功エビデンスということで。
一番右の番号はまだ固定出力のままです。
そこはアイテムを上から順番に出したときに反復処理する想定なので
その添字を表示する予定です。
という感じで、
アイテム情報からアイテム表示欄への転記がうまく行ったところで
今日はおしまい。
次はこれを複数アイテム対応できるようにループ処理にしていきます。