2018/12/10
■ [変愚蛮怒/開発]変愚蛮怒開発日誌part101…特別編「変愚蛮怒の種族実装例 ~MtGの主に青いヤクザ種族~(前編/遅刻した)」
はじめに
という訳でAdvent Calendar 10日目埋め、ついでに遅刻しました。ゆ る し て。
前回、新しい性格の実装(調整)をあっさり1日で済ませてしまいまして、そんじゃあ続けて次に簡単そうな種族でも行ってみようかという例を、前後編か前中後編くらいに分けてやっていこうと思います。
ファンタジーな種族が何だかんだ既にそろい踏みな中、足りない奴をD'ang旧ソースや、ニワカハマりしたMtGなどで探った結果、赤のゴブリン、緑のエルフに並ぶ、青の囲んで棒で叩くヤクザ種族、マーフォークで行ってみようと思います。
ちなみに私はレガシー2tで難題の予見者を出したり、現実を砕くもので暴力の限りを尽くしたり、終末を招くものでねっとりアド稼いだり、積み上げたマナ加速の果てにウラモグ兄貴を叩きつけると絶頂しそうになる変態糞エルドラージ使いなので、無色マナ塗れになりたい奴、至急メールくれや(自分語り)
性格より少々と面倒な種族実装
という訳で、まずさっさと性格の時同様、ハードコーディング上の基礎ステ設定から行ってみましょう。
まずdefines.hに新しくマーフォークのIDを定義し、種族最大数を増やします。
diff --git a/src/defines.h b/src/defines.h index ec8e7db..b6457ab 100644 --- a/src/defines.h +++ b/src/defines.h @@ -774,11 +774,12 @@ #define RACE_S_FAIRY 34 #define RACE_KUTAR 35 #define RACE_ANDROID 36 +#define RACE_MERFOLK 37 /* * Maximum number of player "race" types (see "table.c", etc) */ -#define MAX_RACES 37 +#define MAX_RACES 38
続けてプレイヤー種族のステータステーブル player_race race_info[MAX_RACES] にマーフォークのステータスを書き込みましょう。
--- a/src/tables.c +++ b/src/tables.c @@ -2768,6 +2768,22 @@ const player_race race_info[MAX_RACES] = 0, 0x0800001, }, + { +#ifdef JP + "マーフォーク", +#endif + "Merfolk", + + { -1, 0, 2, 1, -1, 1}, + 2, 3, 2, 1, 6, 11, -1, 5, + 10, 130, + 24, 16, + 66, 6, 130, 15, + 62, 6, 100, 10, + 2, + 0xE77E7FF, + }, + };
現状基本的ステータス以外はハーフエルフからのコピーです。追々調整します。player_raceの構造体は以下の通りです。
typedef struct player_race player_race; struct player_race { cptr title; /* Type of race */ #ifdef JP cptr E_title; /* 英語種族 */ #endif s16b r_adj[6]; /* Racial stat bonuses */ s16b r_dis; /* disarming */ s16b r_dev; /* magic devices */ s16b r_sav; /* saving throw */ s16b r_stl; /* stealth */ s16b r_srh; /* search ability */ s16b r_fos; /* search frequency */ s16b r_thn; /* combat (normal) */ s16b r_thb; /* combat (shooting) */ byte r_mhp; /* Race hit-dice modifier */ byte r_exp; /* Race experience factor */ byte b_age; /* base age */ byte m_age; /* mod age */ 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) */ byte infra; /* Infra-vision range */ u32b choice; /* Legal class choices */ /* byte choice_xtra; */ };
Legal class choicesだけ分かりづらいかもしれませんが、要は職業選択時に種族に向いている職業、を戦士から順に指定しているビット配列です。現状ステータス上には何の影響もないものですね。
んでもって、birth.cに種族の解説メッセージを追加します。とりあえず完全に仕様を確定するまでは仮メッセージを加えます。
+"アンドロイドは機(略) + +"マーフォーク実装中", #else @@ -197,6 +199,8 @@ static cptr race_jouhou[MAX_RACES] = "An android is (略) +"Merfolk implementing.", + #endif };
ここまでは性格と全く同じ要領です。続けて、種族ごとに依存する項目として、生い立ちと、それに伴う社会的地位の変動設定などを加える必要がありますが、ひとまず今は一時人間と同じにしておきましょう。get_history()に以下のように加えます。
@@ -1277,6 +1281,7 @@ static void get_history(void) case RACE_HUMAN: case RACE_BARBARIAN: case RACE_DUNADAN: + case RACE_MERFOLK: { chart = 1; break; diff --git a/src/defines.h b/src/defines.h
ここまでで、一度は走らせてみようとするとこうなります。
これは「辺境の地」の町データをまとめている/lib/edit/t0000001.txtの以下の部分の問題です。
B:$0:N:The White Horse Inn:Otick:Human B:0:N:旅の宿『白馬亭』:オティック:人間 B:$0:A:0:Rest for the night:20:20:r:17:0 B:0:A:0:一泊する:20:20:r:17:0 B:$0:A:1:buy Food and drink:1:1:f:18:1 B:0:A:1:食事をする:1:1:f:18:1 B:$0:A:2:Listen for rumors:5:5:u:19:0 B:0:A:2:噂を聞く:5:5:u:19:0 B:$0:A:3:request Quest:0:0:q:6:0 B:0:A:3:クエスト:0:0:q:6:0 B:$0:A:4:Teleport to other town:500:500:m:42:0 B:0:A:4:他の町へ移動:500:500:m:42:0 B:$0: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 B:0: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
一番最後の行です。宿で、アンデッドやバルログなどが魔道具のエネルギーや血やら死体やらを売ってもらえない制限処理に該当する部分が、今回のマーフォークの追加に伴って、スロットが一つ増えたため、「引数不足」になってしまった次第です。このまま進めると恐ろしいバグで強制終了し、再起動しても町が消滅したりするというギャグみたいな状態になります。
ではこれを直していこうということで続きは次回。