星田さんの記事に対するコメント。
![](https://blogimg.goo.ne.jp/user_image/48/60/c8e6c586e27decd07aeb49f48670b6b1.png)
さて問題は装備品の管理をどうするか・・。構造体で管理しようとすると、アイテム構造体と被りが多いのですごく無駄な気分。が、アイテム自体に「トータル個数」を持たせようとすると同じ名前・効果のアイテムでも別のショップで別の値段で売られていたりするので、これまた厄介。
ということで結局ドット対リストで管理するのが一番良いかな?と結論。武器防具に関してはバトル関係をちょっと変更して効果の高いものから持っているかを判定して補正をかけるって感じかな・・・
おお、ファイナルファンタジー方式!
とか勝手に呼んでるんだけど(笑)。
余談だけど、恐らく、プログラムとして見るとドラクエのアイテム管理法とファイナルファンタジーのそれって違うんだよな。
ドラクエはご存知の通り、パーティーメンバー1人頭、アイテムが最大8個しか持てない。
![](https://blogimg.goo.ne.jp/user_image/22/c5/8ef6ae28ec4ce1af1fff02e0db58f82f.png)
一方、ファイナルファンタジーの場合、アイテムはパーティ共有で、しかもアイテムを無尽蔵、って言う程持てる。
![](https://blogimg.goo.ne.jp/user_image/2d/07/8f42d65991ed0ede916e9f53e9792f29.png)
両者ともファミコンのメモリの少なさと戦ってた筈なのに、この違いは何なのか。
恐らく、だけど、ドラクエの場合は、本当にキャラ毎にアイテムリストを保持していて、Lisp用語で言うとアイテムをそこへconsしていってる。だからアイテム名重複もあり得る。
一方、ファイナルファンタジーの場合、パーティは「アイテム個数」を含んだアイテム構造体を「全部含んだ」アイテムテーブルを最初っから大域変数的に持ってる、と思われる。
言い換えると、ファイナルファンタジーはパーティは初めから「全部のアイテムを」0個保持してる状態で、アイテムを得る事によってそのテーブルに含まれる特定のアイテムの個数フィールド(あるいはスロット)を+1してんじゃないか。そして出力の際、個数が0個以外のアイテムをフィルタリングして表示してる(※)。
どっちが優秀だ、って事はない。なんせゲームデザインが違うから、ね。
ただ、恐らく星田さんが今考えてる設計は、どっちかっつーとファイナルファンタジーのアイテム管理に近い方法論なんじゃないか、って勝手に思っている。
![](https://blogimg.goo.ne.jp/user_image/36/3d/6ddcb379d6c744d3c3493d08174ac51c.png)
じゃあ次にアイテム構造体のリストを作って・・動かしてみるか・・と思ったんですが今日はバイト先のMX-Linuxで動かしてるので秀丸エディタが無いんですよね!置換機能が使えないと(LeafPadも使えるとは思うけど試してない)面倒なんだよなぁ・・。もしかしてRangeの引数を001 032としたら3桁の数字で生成されたりしない?と思ったけど・・無理か〜w
![](https://blogimg.goo.ne.jp/user_image/1e/3e/2f2247f473384db095640764b016f715.png)
考えてみると、今後も構造体のリストを作るときに必要な作業なので特定の文字列と連番を組み合わせて、ついでにコンマもつけた文字列のリストを生成する関数を作っておくか・・と。相当ダサげな書き方だけど、ま、エエわ。結局、これをまたテキストエディタに貼り付けて見ないとどうなるのか分からないけど一応出来た。
どっちにせよ、発想がいい。
星田さん、センスあるよね。
001、002、・・・・・・と言う「表示形式」をゼロパディング、って呼びます。「表示形式」なんで、原則、これは文字列の出力形式。
ちなみに、ANSI Common Lispのformatだったら、
![](https://blogimg.goo.ne.jp/user_image/6b/6e/71253522550a94f88dfbb9e58b3c6f64.png)
と言うカタチで自在にゼロパディングを喰らわせられる。
ところが、標準ではないにせよ、Scheme系言語処理系のformatは、一般に、ANSI Common Lispを真似てはいるが、ANSI Common Lispのそれより遥かに非力だ。
とは言っても、ANSI Common Lispのformatはそれ自体が出力専用のミニ言語、って呼んで良いほどの複雑さを持っていて、Scheme系言語の「ミニマリズム」とは相容れない。
結果、ゼロパディングを行うには別の方策を考えないといけなくなる。
Racketの場合、ヘンな関数名だけど~aと言う関数を使うといい。
星田さんがやりたい事は基本こんなカンジだろう。
![](https://blogimg.goo.ne.jp/user_image/0a/e5/3d45a94e70792aaa9ffda8ab5eb42962.png)
関数~aはキーワード引数で挙動を制御出来る。#:alignで右寄せ、左寄せ、真ん中を指定、#:widthで最大文字数を、そして#:pad-stringで「隙間を何の文字列で埋めるか」指定出来る。
あとは、文字列"I"とstring-appendするか、あるいはformatを使うか、と言う話になる。
![](https://blogimg.goo.ne.jp/user_image/48/95/b0a92fa32a6dbf68822a71013606d72b.png)
![](https://blogimg.goo.ne.jp/user_image/09/7a/ad14e9887104ae70a4bc4487f3305b30.png)
![](https://blogimg.goo.ne.jp/user_image/1a/e3/55726feeb28ea5e6668a7e5947c088d9.png)
ひょっとしてstring->symbolなのか?と試してみたけど謎のパイプに挟まれた状態。これも秀丸にコピペしてどうなるかチェックしないとな・・
R7RSにはこんな事が書いてある。
![](https://blogimg.goo.ne.jp/user_image/73/21/15baaac9f4ed318764ff28aa65fc47b4.png)
コンマが含まれてない・・・・・・。
続いてこう書かれている。
![](https://blogimg.goo.ne.jp/user_image/2d/68/7d72058d63f42e3c0235788554f65ae9.png)
つまり、(シンボルに使える)識別子にはコンマが含まれないが、どうしても使いたい場合は垂直線に挟まれたシンボルへと変換される、って事です。
ついでに言うと、コンマ(,)はScheme系言語ではマクロ用の記号なんで、これを巻き込んだままシンボル化するのはあまり上手い手とは言えないです。
※: 結局、アイテム保持用のエリアを作ろうと作らまいと、アイテムのデータ自体のリストをゲームは持ってないとならない。
つまり、ファイナルファンタジーの場合は、恐らくぶっちゃけ、「全アイテムデータのリスト」と「パーティが保持するアイテムのリスト」を兼用、つまりメモリ上で共有してるデザインなんじゃないだろうか。そうすると、パーティメンバーが保持するアイテムリスト、と言う余計なメモリを使う必要がなくなる。
だとすれば、これはかなりアタマの良いやり方だ。
こういうやり方は、恐らく、ファイナルファンタジーのプログラマである、天才、ナーシャ・ジべリが思いついたんじゃなかろうか。
「キャラクタがアイテムを持ってる」設定でも、それをそのまま額面通り、バカ正直に実装しなくても良い、と言う盲点を突いたアイディアのような気がする。