Help us understand the problem. What is going on with this article?

ゲームAdventureをスマホに移植する2週目:CをC#に変換

More than 1 year has passed since last update.

はじめに

これはアドベンチャーゲームの元祖「Colossal Cave Adventure」をUnityを使用してスマホに移植している作業ログです。
1週目 解析編: Adventureのマスターデータを解析する
2週目 移植編: CのコードをC#に変換する ←今ここ

Colossal Cave Adventureプレイ画面
スクリーンショット 2018-08-09 7.41.47.png

移植編

ゲームAdventureのコードはFORTRAN版とC版があるのですが、
どちらもUnityでは使用できないので数千行のCのコードをもくもくとC#へ移植しました。
今回はCのコードをC#に移植した手順を書きます。

スクリーンショット 2018-08-18 7.24.09.png

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

INIT.C
void init() {
    //実際の処理
}
DONE.C
void done(int entry) {
    //実際の処理
}

↓移植

Init.cs
//INIT.C
namespace Adventure {
    public partial class Game {
        void init() {
            //実際の処理
        }
    }
}
Done.cs
//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)で動作させる予定です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away