2010/07/09
■ [ファルコム]BrandishVT(4)の黒クレール
本来選択次第でキャラの善悪アライメントが変化していって、それでエンディングが決定するゲームなのだが、このキャラも含めて全員DARKエンドにありえないほどの清々しいカタルシスがあるので、こういうバージョンしか書けない。うへへ。
■ [変愚蛮怒/スポイラー]身長体重の決め方について
ゲームバランスになんとも関わらない要素であるが、体格の小さい@達ピザっぷりや、逆に体格の大きい@のガリガリぶりが気になる人が私以外にもいるだろうし、一応検証しておく。
とりあえず種族上の特徴をまとめるtype.hのplayer_race構造体は以下の要素が存在する。どれも基本値に分散値の形で決定されている。
byte m_b_ht; /* base height (males) */ byte m_m_ht; /* mod height (males) */ byte m_b_wt; /* base weight (males) */ byte m_m_wt; /* mod weight (males) */ byte f_b_ht; /* base height (females) */ byte f_m_ht; /* mod height (females) */ byte f_b_wt; /* base weight (females) */ byte f_m_wt; /* mod weight (females) */
これに対応する人間のパラメータは以下の通りである。
72, 6, 180, 25, 66, 4, 150, 20,
身長、体重の数値がおかしく思えるが、これはインチとポンドで表現されているため。基本的に内部処理ではこの値で処理され、日本語版のダンプ表記のみcmとkgで表示される。
そして実際に@を生成する際、身長体重を決める関数はbirth.cのget_height_weightにある。十行ちょっとの簡単な式である。
void get_height_weight(void) { int h_percent; /* 身長が平均にくらべてどのくらい違うか. */ /* Calculate the height/weight for males */ if (p_ptr->psex == SEX_MALE) { p_ptr->ht = randnor(rp_ptr->m_b_ht, rp_ptr->m_m_ht); h_percent = (int)(p_ptr->ht) * 100 / (int)(rp_ptr->m_b_ht); p_ptr->wt = randnor((int)(rp_ptr->m_b_wt) * h_percent /100 , (int)(rp_ptr->m_m_wt) * h_percent / 300 ); } /* Calculate the height/weight for females */ else if (p_ptr->psex == SEX_FEMALE) { p_ptr->ht = randnor(rp_ptr->f_b_ht, rp_ptr->f_m_ht); h_percent = (int)(p_ptr->ht) * 100 / (int)(rp_ptr->f_b_ht); p_ptr->wt = randnor((int)(rp_ptr->f_b_wt) * h_percent /100 , (int)(rp_ptr->f_m_wt) * h_percent / 300 ); } }
randnorはz-rand.cに存在する擬似的な正規乱数生成関数で、第一引数が中央値、第二引数が分散値にあたる。よって基本的な生成の流れは、正規乱数で身長の決定>身長の種族下端の対する比を計算>比に合わせて体重の基本値と分散を修正した上で正規乱数生成、の流れである。正直何のひねりもない。
結局体重の原因は、基準の決め方にあるようだ。そもそも人間女の身長体重は中央値に対応させた場合、167cmの67kgになる。BMI24.02。これを標準にするのは多少@がガチムチであることを考慮しても厳しいだろう。ともかく種族的なイメージと共に現実的な基準値に修正しなおすのが一番の対策のようだ。