#author("2020-07-26T18:54:51+09:00","default:shinkai","shinkai")
[[DCSS]] > インストールガイド


[[試験公開鯖>http://lazy-life.ddo.jp:8080]]運用のためのメモ。試行錯誤中につき無保証。

** 環境
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

現在pyenv + python 2.7.6で運用中。~
anyenv + python 2.7.12でも動いた。
現在anyenv + python 2.7.12で運用中。

*** GCCのバージョン
最新trunkではg++ 4.8を要求されるようです。g++ --version して4.6とかだったら以下のサイトを参考にインストール。(再ログイン必要かも)
最新trunkではg++ 4.8以上を要求されるようです。g++ --version して4.6とかだったら以下のサイトを参考にインストール。(再ログイン必要かも)
- http://venuschjp.blogspot.jp/2013/11/c11gcc.html

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倍が目安らしい?((最近のCPUではコア数と同じにした方がよいとの話も。とにかくコア数以下は非効率))

再ビルド時には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に公開してるので適宜見てください
- https://github.com/dplusplus/patched-dcss-webtile

*** 手動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((sprintのスコアはscores-sprint-****の形で別ファイル))という名前で各種情報が保存され、ランキング表示等のタイミングで適宜参照されます。~
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((デフォルトで1000))件までしか保存しないため注意です。~
全スコアを参照したい場合は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程度になるのでディスク容量の節約になります。rcs/running/ 以下のttyrecファイルは現在進行中のプレイなので除外しつつ、定期的に自動圧縮するといいでしょう。
--- fsniperというツールがあり、設定ファイルで指定したディレクトリ以下にファイルが生成されたのを検知してスクリプトを走らせることができます。現在こちらで自動圧縮しています。
--- Ubuntuならaptからインストールできます。~/.config/fsniper/configに以下を記述してfsniper --daemonでデーモンとして動かします。
-- 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()

 watch {
     /path/to/ttyrecs {
         recurse = true
         *.ttyrec {
             handler = tar jchf %d/%f.bz2 %d/%f && rm %d/%f
         }
     }
 }

--- %%でフルパスが取れるとか書いてありますがスラッシュがなぜか余計に付いてたりするので%d(ディレクトリ名に置換), %f(ファイル名に置換)で代用しています。
-- 部分バックアップはしたいが大量の*.ttyrec.bz2はフルバックアップ時だけでいいという時のために、rcs/ttyrecsディレクトリは別のところに置いてシンボリックリンクを張るのがよさげ。

* 関連リンク

- Setting Up dgamelaunch and WebTiles ~
https://crawl.develz.org/wiki/doku.php?id=dcss:server:setting_up_dgamelaunch_and_webtiles
- Maintaining dgamelaunch and WebTiles ~
https://crawl.develz.org/wiki/doku.php?id=dcss:server:maintaining_dgamelaunch_and_webtiles


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS