アイテムとメッセージ

ローグライクのアイテムやモンスターの実装はどういうのがベストか。
今作ってるのではモンスターはmlist[N_MONSTS]とかいうでかい配列にしてしまった。アイテムもでかい配列にしてしまった。これだとアイテムやモンスターが配列サイズを越えて生成できなくなってしまう。Angbandでは一定数を越えたとき重要度の低いものを消すことで(いわゆるアイテム圧縮のメッセージが有名)解決しているが、それをパクるか。
動的メモリ確保のRogue式なら空きメモリの許す限りアイテムを出せるが……。
ゲームに時間制限を設けて、どんなに頑張っても配列サイズを越えられないようにするというのも考える。
シューティングならアイテムや敵弾は流れていくとか時間で消えるとかしても自然だからデザイン上で問題にはならないけど、普通のローグライクだと床の上の防具とかが消えるのは不自然。まあAngbandでは圧縮で消える可能性があるわけだけど。
☆☆☆☆☆☆
モンスター(プレイヤー含む)にアイテムを持たせるにはアイテムのデータにmidxとか作ってmlist[]での番号をアイテムに書きこむことで実装しようと思っている。-1なら床にある、とか。
☆☆☆☆☆☆
メッセージはcrawlタイプがいい感じで動いている。
たとえば

char m[MAXMESSAGE][MESSAGELEN]; /*メッセージデータのキュー*/
int nextmessage, messageline;

を用意する。
メッセージ追加は

strcpy(m[nextmessage++], msg);
messageline++;

とか。
表示は現在のnextmessageからさかのぼってmessagelineの行数分表示する。more()では「messageline -= 一度のMAX表示件数;」。
そんで、プレイヤーの入力の「key = getch();」の*直後*に「messageline = 0;」する、つまり「キー入力→表示分のメッセージ消し→入力されたコマンドの行動や次の入力までの敵の動きなどのメッセージをズラズラ表示」の順番に処理すると、うまくいく。
「古いメッセージ表示」コマンドではもちろんnextmessageを基準にリストすればいい。
☆☆☆☆☆☆
以上、開発メモでした。