DCSS > インストールガイド

試験公開鯖運用のためのメモ。試行錯誤中につき無保証。

環境

Ubuntu Linux server 12.04 or later

準備

依存ツール・ライブラリの導入

# apt-get install git build-essential flex bison libsdl-dev libsdl-image1.2-dev libncursesw5-dev

↓必須ではないが何度もビルドする際にビルドが速くなるらしい

# apt-get install ccache binutils-gold

pyenvでpython 2.7.6~をインストールした後、

% pip install tornado==3.2.2

を行う。 (※tornado 4.x系だとタイルが表示されない症状があったため3.x系最新を入れる)

最近はビルドの際にpyyamlが必要なのでこちらもインストールしておく。

% pip install pyyaml

現在anyenv + python 2.7.12で運用中。

GCCのバージョン

最新trunkではg++ 4.8以上を要求されるようです。g++ --version して4.6とかだったら以下のサイトを参考にインストール。(再ログイン必要かも)

add-apt-repositoryがない場合はpython-software-propertiesパッケージで導入。

GCC4.8系を追加で入れたのにビルドエラーが出る

以下のようにしてシンボリックリンクを4.8系に更新する。

% sudo su -
# cd /usr/bin
# ARCH=$(cc -dumpmachine)
# ln -fs gcc-4.8 $ARCH-gcc
# ln -fs g++-4.8 $ARCH-g++

ソースコードリポジトリを持ってくる

% git clone --recursive https://github.com/crawl/crawl.git

デフォルトではディレクトリ名がcrawlになるので変えたい場合は

% git clone --recursive https://github.com/crawl/crawl.git (目的のディレクトリ名)

gitoriousのリポジトリはもはや更新されていません。既存のリポジトリがある場合は移行しましょう。

(Git管理下のディレクトリに入ってから)
% git remote set-url origin https://github.com/crawl/crawl.git

Webtile版

編集

source/AppHdr.hのDGAMELAUNCH定義を有効化

   // #define DGAMELAUNCH
       ↓
   #define DGAMELAUNCH

同じくDGL_MACRO_ABSOLUTE_PATH定義をコメントアウト

   #define DGL_MACRO_ABSOLUTE_PATH
       ↓
   // #define DGL_MACRO_ABSOLUTE_PATH

webserver/config.pyを編集してプレイ状況表示用のファイルmilestonesのパスを変更

milestone_file = "./saves/milestones"

crawl-ref/source以下にrcsディレクトリを置く。別の場所からシンボリックリンクを張ってもよい。

mkdir /path/to/crawl/crawl-ref/source/rcs

コンパイル

% cd crawl-ref/source
% make WEBTILES=y SAVEDIR=saves

マルチコアなPCの場合-jオプションで並列コンパイルによる高速化を期待できる。
論理コア数は/proc/cpuinfo参照。大体コア数の2倍が目安らしい?*1

再ビルド時にはmake cleanしてからのビルドを推奨する。タイル周りの変更があった場合、タイルが化けるおそれがある。

本体を何かしらいじってデバッグする際には make debugが役立つ。→DCSS/デバッグガイド

ゲームサーバーの起動

% python webserver/server.py
  • port8080でサーバーが動く。変更したい場合はwebserver/config.pyを編集
    bind_port = 8080 #ここを書き換え
  • 設定ファイルはcrawl-ref/setting/init.txtからコピーされるのでデフォルト設定を変更したい場合はそれを編集
    • travel_delay等

トラブルシュート(備忘録)

DCSS 0.16未満をチェックアウトしようとしたときにサブモジュールが取得できない

古いバージョンではサブモジュールのURL指定がgitoriousのままになっています。
.gitmodulesを編集してgitorious.org→github.comに全置換した後で、

% git submodule update --init

でサブモジュールを取得しましょう。

Ubuntu 18.04でDCSS0.18未満をコンパイルしようとしたときにmi-enum.hの生成に失敗する

Perl 5.26に上がっている影響でcrawl-ref/source/util/gen-mi-enumの実行の際にエラーが出ます。
{の直前に\を入れてエスケープしましょう。

- s/^enum monster_info_flags\n{\n//m && s/^\s*NUM_MB_FLAGS.*//ms
+ s/^enum monster_info_flags\n\{\n//m && s/^\s*NUM_MB_FLAGS.*//ms

過去のバージョンがG++7系でコンパイルできない

gcc-5、g++-5をインストールして(gcc-5は不要かも)

% sudo apt install gcc-5 g++-5

コンパイラのバージョンを指定します。

% make WEBTILES=y SAVEDIR=saves GCC_VER=5

各種独自設定

試験鯖独自拡張分のコードはgithubに公開してるので適宜見てください

手動dump出力の際にチャットに出るURLの設定

webserver/config.pyのmorgue_url設定を書き換える。

("dcss-web-trunk", dict(
    name = "DCSS trunk",
    (中略)
    morgue_url = "http://lazy-life.ddo.jp:8080/morgue/%n/",
    #デフォルトはNone(出力しない), %nにはプレイヤー名が挿入される

ログ出力

webserver/config.pyのlogging_config['filename']をコメント解除し、必要なら適宜ファイルパスを変更します。

logging_config = {
#    "filename": "webtiles.log",
    ↓
    "filename": "webtiles.log",

ログは自動的にログローテーションされ、デフォルトでは10メガバイト×5ファイルです。

ローテーションでの最大ファイル数は以下のように設定を追加することで変更できます。

logging_config = {
    "filename": "webtile.log",
    "level": logging.INFO,
    "backup_count": 100, # ←ここを追加
    "format": "%(asctime)s %(levelname)s: %(message)s"
}

scores/logfiles

過去のスコアはビルド時に指定されたセーブデータディレクトリにscores*2という名前で各種情報が保存され、ランキング表示等のタイミングで適宜参照されます。
scoresファイルの内容(抜粋)

v=0.15-a0:vlong=0.15-a0-1379-g772b624:lv=0.1:tiles=1:name=dplusplus:race=Demons
pawn:cls=Fire Elementalist:char=DsFE:xl=27:sk=Stealth:sklev=23:title=Impercepti
ble:place=D::$:br=D:lvl=0:absdepth=1:hp=203:mhp=203:mmhp=223:str=17:int=21:dex=
17:ac=41:ev=23:sh=9:god=Ashenzari:start=20140515150443S:dur=52909:turn=120614:a
ut=1170730:urune=4:nrune=4:kills=3750:fifteenskills=Fighting,Short Blades,Dodgi
ng,Stealth,Spellcasting,Fire Magic:status=deflect missiles:gold=1640:goldfound=
12050:goldspent=10410:sc=1848548:ktyp=winning:dam=-9999:sdam=0:tdam=0:piety=156
:end=20140520154553S:map=ncdulo_wetmaze:tmsg=escaped with the Orb:vmsg=escaped 
with the Orb and 4 runes!

scores*の方はランキング画面などを実装する際に有用ですが、最大SCORE_FILE_ENTRIES*3件までしか保存しないため注意です。
全スコアを参照したい場合はlogfileというファイルに上記と同じ形式で記載されています。ただし、こちらはスコア順に並べられてはいません。

また、endで指定してあるdump日付は月の項がなぜか1-12でなく0-11になっているのでそのままではdumpのファイル名に使用できません(dumpのファイル名の月部分は1-12)。注意すること。

ttyrecs

webserver/config.pyで指定したディレクトリにゲーム中のコマンド記録が保存されます。

games = OrderedDict([
    ("dcss-git", dict(
(中略)
        ttyrec_path = "./rcs/ttyrecs/%n",

生成される*.ttyrecファイルはけっこうなファイルサイズがあり、プレイ回数に応じてどんどん増えていくため、レンタルサーバなどディスク容量が潤沢でない環境だとなんらかの対策を打つ必要があります。

  • 保存しない
    • 保存する必要が無ければ問題は解決です。出力先に/dev/nullを指定すれば多分大丈夫。
  • 圧縮する(現運用はこちら)
    • bzip2で圧縮すれば1/10程度になるのでディスク容量の節約になります。
      ttyrecファイルの保存タイミングで自動的にbzip圧縮されるように、webserver/process_handler.pyの_on_process_end()関数の末尾に以下のように追記します。(行頭の+は入れないでください)
      diff --git a/crawl-ref/source/webserver/process_handler.py b/crawl-ref/source/webserver/process_handler.py
      index 739d64a007..8b20d67d3a 100644
      --- a/crawl-ref/source/webserver/process_handler.py
      +++ b/crawl-ref/source/webserver/process_handler.py
      @@ -795,6 +795,13 @@ class CrawlProcessHandler(CrawlProcessHandlerBase):
      
               self.handle_process_end()
      
      +        if os.path.exists(self.ttyrec_filename):
      +            try:
      +                subprocess.Popen(["bzip2", self.ttyrec_filename])
      +                self.logger.info("Compressed %s", self.ttyrec_filename)
      +            except OSError as e:
      +                self.logger.exception(e)
      +
           def _on_socket_close(self):
               self.conn = None
               self.stop()

関連リンク


*1 最近のCPUではコア数と同じにした方がよいとの話も。とにかくコア数以下は非効率
*2 sprintのスコアはscores-sprint-****の形で別ファイル
*3 デフォルトで1000

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-01-24 (金) 01:37:40 (1751d)