2010/07/18
■ [変愚蛮怒/開発]新しい種族を追加するために一通り必要な処置
bandとは言っても実質変愚のみの話。一応源流のZangやヴァニラでもここと同様の処置でいけるとは思う。
新たにレイシャルなどを加えたり、自前耐性を指定するなどは別として、とりあえず本体がまともに動作するようにするためには、最低限これらを行っておく必要がある。一応某所のショゴスパッチなども参考にして修正すべき箇所を探しているが、試行錯誤中なので、必要な要素はまだあるかもしれない。随時追加予定。
- src/define.hに#define RACE_XXXX XXを追加して、MAX_RACESの値を追加分だけ増やす。
- src/birth.cのstatic cptr race_jouhou[MAX_RACES]に種族の解説を追加。
- src/table.cのplayer_race race_info[MAX_RACES]に追加する種族の基礎能力値を記述。
- lib/edit/t000000x.txt(各町の情報を記したテキストデータ)の各店の情報に、「B:4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0」などとある部分、これは(恐らく)施設の機能を使えるか否かを示している。追加した種族の性質に応じて選択。ちなみにこれは店毎に決めてある訳で、やりようによっては人外にしか食事を出さない店とかが、ソース上の改変無しで作れるのではなかろうか。
その上で色々追加の余地のあるものは現状これ。
- src/birth.cの生い立ちを自動で決めるチャート設定。
- src/avater.cの種族によって決まる徳の指定
- 各種ヘルプファイルの該当箇所
2010/09/21追記・種族の耐性を指定する方法
xtra1.cに void calc_bonuses(void) という関数が存在する。これがプレイヤーキャラの能力値や各種フラグを再計算する関数で、能力値が変動する要素が加わった際の更新の際に必ず呼び出されている。この関数のコードを下っていけば
/***** Races ****/ if (p_ptr->mimic_form)
のコメントとif文に行き当たる。
ここから以下が@の種族特性に応じて、player_info構造体に加える修正にあたる。当該if文のthen内は悪魔領域の悪魔変化、魔王変化、あるいは暗黒領域の吸血鬼変化で一時的に種族変化した場合の各種耐性指定なので、これを飛ばしelse内のswitch文に新種族の候補を加えて耐性や修正を指定すればいい。例を取って、クラッコンだと
case RACE_KLACKON: p_ptr->resist_conf = TRUE; p_ptr->resist_acid = TRUE; /* Klackons become faster */ new_speed += (p_ptr->lev) / 10; break;
こうである。
幽霊の地獄属性攻撃吸収などのかなり特殊な仕様は別の場所で処理されているようだが、とりあえず大体のお好みの指定はこれでできるはず。ただし、話はこれだけでは終わらない。
このままでは新種族のダンプを見ても@欄に対応する自前耐性が表示されていない。が、内部処理中ではヘル・ワイアームのMAX火炎ブレスを食らってもダメージは500で済んでいる。
実は*bandのソース上の仕様では、file.c内のダンプ出力の内容はplayer_type構造体中の情報から引用されていない。ダンプの耐性リストは各耐性が装備に起因するのか、種族特性に起因するのかを区別しているため、単に耐性があると一律に扱っているplayer_typeから情報を引っ張ることができないためだ。
なので、代わりにfile.c上で種族特性を指定している static void player_flags(u32b flgs[TR_FLAG_SIZE]) 関数に、同様のフラグを立ててやらねばならない。クラッコンだとこうなっている。
case RACE_KLACKON: add_flag(flgs, TR_RES_CONF); add_flag(flgs, TR_RES_ACID); if (p_ptr->lev > 9) add_flag(flgs, TR_SPEED); break;
追記以上。残りレイシャルなどの追加方法も追って解説予定。
2010/10/24追記・種族を大量追加する場合の問題点
一種類二種類の種族追加では特に問題なかったが、D'angbandのために種族を大量追加したところ、t_info系データを初期化する際に問題が発生した。
原因は施設利用フラグをパースして取り扱う関数parse_line_building()のバッファが
char *zz[33];
と33種類しか用意されてないのが原因だった。このバッファは職業フラグを取り込む際にも利用しているようなので
char *zz[MAX_RACES];
とするにははばかる気がする。とりあえずD'angbandでは100位に修正しておいた。