はじめに
これはアドベンチャーゲームの元祖「Colossal Cave Adventure」をUnityを使用してスマホに移植している作業ログです。
1週目 解析編: Adventureのマスターデータを解析する
2週目 移植編: CのコードをC#に変換する ←今ここ
移植編
ゲームAdventureのコードはFORTRAN版とC版があるのですが、
どちらもUnityでは使用できないので数千行のCのコードをもくもくとC#へ移植しました。
今回はCのコードをC#に移植した手順を書きます。

1.defineの移植
C#にdefineはないのでconstに変換しました。
方法 : C# で定数を定義する
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/how-to-define-constants
# define MAXTRS 79
↓移植
public const int MAXTRS = 79;
2.typedefの移植
C#にtypedefはないのでusingを使用しました。
typedef loc_t long;
↓移植
using loc_t = System.Int64;
3.関数の移植
Cなのでクラスはなく、共通ヘッダと各Cファイルに関数が分かれていました。
C#ではpartial型を使用して分割クラスとして移植しました。
変数名・メソッド名は他とかぶる可能性が大きいためnamespaceを定義しました。
partial (型) (C# リファレンス)
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/partial-type
void init() {
//実際の処理
}
void done(int entry) {
//実際の処理
}
↓移植
//INIT.C
namespace Adventure {
public partial class Game {
void init() {
//実際の処理
}
}
}
//DONE.C
namespace Adventure {
public partial class Game {
void done(int entry) {
//実際の処理
}
}
}
4.変数・処理の移植
変数全般に関して、元コードは1978年制作という時代だけに現在とは方針が異なっていました。
元コードの方針
- 変数はローカル定義よりなるべくグローバル定義で行う
- 変数名はなるべく略す
現在の(一般的な)方針
- 変数はグローバル定義よりなるべくローカル定義で行う
- 変数名はなるべく略さない
また、以下の変数名が使われていたのですが、予約語で使用できないため変更しました。
fixed, break, throw
ゲームAdventureで使用されている略された変数名で、
パッと見わからなかったものを以下に挙げます。
名称 | 説明 |
---|---|
e | 東 |
w | 西 |
n | 北 (ne, nwもあり). もしくはYESNOでのNOを表す |
s | 南 (se, swもあり) |
u | 上 |
d | 下 |
cond | CONDition? 条件に使用する状態ビット |
lit | LighT |
liq | LIQuid |
obj | OBJect. RPGのイベント全般(アイテム, 敵, スイッチetc..)を指している |
invent | INVENTory. アイテムのこと |
trs | TReaSure. おたからアイテムのこと |
loc | LOCation. SECTION:1を参照 |
cval | Class VALue. c*は階級に関する変数. 階級とは探検終了時にされる評価のこと |
dflag | Dwarf FLAG. d*はドワーフに関する変数 |
odloc | Old Dwarf LOCation. od*もドワーフに関する変数 |
hcave | 洞窟に関するヘルプ. h*はヘルプに関する変数 |
fixed | objの状態がはいる |
plac | objの移動元がはいる. 4文字に略した変数はobjの場所系変数というルール? |
fixd | objの移動先がはいる. 4文字に略した変数はobjの場所系変数というルール? |
pspeak | テキスト処理で先頭pのときはParagraph?Page?(SECTION:1)を指している |
rspeak | テキスト処理で先頭rのときはaRbitary(SECTION:6)を指している |
mspeak | テキスト処理で先頭mのときはMagic(SECTION:12)を指している |
weq | Word EQualの略 |
ran | RANdomの略 |
rnum | Read NUMber. 指定のマスターデータのキーIDを指している |
pct | PerCenT. 百分率を指している |
k | ただのtmp変数. 複数用途に使用しているので一概に言えない. kk, k2, kpも同様 |
spk | SPeaK |
prop | PROPerty. ゲーム内の状態. |
y2 | ゲーム内で使用する固有名詞 |
foo | ゲーム内で使用する固有名詞 |
つづく
お盆なのであまり時間取れませんでしたがロジックは移植完了。
来週はCUIゲームのAdventureをUnity上(GUI)で動作させる予定です。