DCSS 0.23 Tournament開催のご案内

Dungeon Crawl Stone Soup 0.23のリリースに伴い、今回もDCSSオンライン大会が開催されます。

http://lazy-life.ddo.jp:8080/ を含む各公式サーバでの参加が可能です。

開催日程

日本時間 2019/2/9(土) 05:00 〜 2/25(月) 05:00

参加のしかた

1〜6人のチーム(clanと呼びます)を組み、期間内のプレイ内容に応じたポイント合計を競います。

チームリーダーはDCSS 0.23の設定ファイルの先頭

# TEAMNAME nameofteam
# TEAMMEMBERS player1 player2 player3 player4 player5

とclan名(半角英数、アンダースコア、ハイフンのみ可)とプレイヤー名(1人チームの場合はTEAMMEMBERSのみで可)を指定します。

また、各チームメンバーは同様に

# TEAMCAPTAIN nameofcaptain

のようにリーダー名を指定します。

チームメンバーの入れ替えは日本時間 2/16 05:00まで可能で、それ以降は凍結されます。

ポイント

ゲームプレイで稼げるポイントを得る条件は「オーブを手にして脱出」「各分岐の最下層に到達」「各神の信仰値を******まで上げる」などオーソドックスなもののほか、
「オーブを手にした後霊廟分岐に突入して黄金のルーンを入手」「異なる組み合わせで4連勝」などプレイヤーページにバナーが付与される特殊条件も数多くあります。
また、「Nemelex' Choice」として「ランダムに指定された組み合わせで先着順に勝利した8名」が得られる実績も期間中に何度か更新されます。
詳細は公式ページをご覧ください。

Discordサーバ

日本鯖用のDiscordのサーバが設置してあります。雑談、観戦、相談などさまざまな用途にどうぞ。

それでは、参加をお待ちしています!

DCSS 0.22 Tournament開催のご案内

Dungeon Crawl Stone Soup 0.22のリリースに伴い、今回もDCSSオンライン大会が開催されます。

http://lazy-life.ddo.jp:8080/ を含む各公式サーバでの参加が可能です。

開催日程

日本時間 2018/8/11(土) 05:00 〜 8/27(月) 05:00

参加のしかた

1〜6人のチーム(clanと呼びます)を組み、期間内のプレイ内容に応じたポイント合計を競います。

チームリーダーはDCSS 0.22の設定ファイルの先頭

# TEAMNAME nameofteam
# TEAMMEMBERS player1 player2 player3 player4 player5

とclan名(半角英数、アンダースコア、ハイフンのみ可)とプレイヤー名(1人チームの場合はTEAMMEMBERSのみで可)を指定します。

また、各チームメンバーは同様に

# TEAMCAPTAIN nameofcaptain

のようにリーダー名を指定します。

チームメンバーの入れ替えは日本時間 8/18 05:00まで可能で、それ以降は凍結されます。

ポイント

ゲームプレイで稼げるポイントを得る条件は「オーブを手にして脱出」「各分岐の最下層に到達」「各神の信仰値を******まで上げる」などオーソドックスなもののほか、
「オーブを手にした後霊廟分岐に突入して黄金のルーンを入手」「異なる組み合わせで4連勝」などプレイヤーページにバナーが付与される特殊条件も数多くあります。
また、「Nemelex' Choice」として「ランダムに指定された組み合わせで先着順に勝利した8名」が得られる実績も期間中に何度か更新されます。
詳細は公式ページをご覧ください。

Discordサーバ

今回はDiscordのサーバも設置してみました。雑談、観戦、相談などさまざまな用途にどうぞ。

それでは、参加をお待ちしています!

DCSS 0.21 Tournament開催のご案内

Dungeon Crawl Stone Soup 0.21のリリースに伴い、今回もDCSS 0.21オンライントーナメントが開催されます。

http://lazy-life.ddo.jp:8080 を含む各公式オンラインサーバでの参加が可能です。

開催日程

日本時間 2018/1/6(日) 05:00 〜 1/22(月) 05:00

参加のしかた

最大6人のチーム(clanと呼びます)を組み、期間内のプレイ内容に応じたポイント合計を競います。

チームリーダーはDCSS 0.21の設定ファイルの先頭

# TEAMNAME nameofteam
# TEAMMEMBERS player1 player2 player3 player4 player5

とclan名(半角英数、アンダースコア、ハイフンのみ可)とプレイヤー名(1人チームの場合はなくても可)を指定します。

また、各チームメンバーは同様に

# TEAMCAPTAIN nameofcaptain

のようにリーダー名を指定します。

ポイント

ゲームプレイで稼げるポイントを得る条件は「オーブを手にして脱出」「各分岐の最下層に到達」「各神の信仰値を******まで上げる」などオーソドックスなもののほか、
「オーブを手にした後霊廟分岐に突入して黄金のルーンを入手」「異なる組み合わせで4連勝」などプレイヤーページにバナーが付与される特殊条件も数多くあります。
また、「Nemelex' Choice」として「ランダムに指定された組み合わせで先着順に勝利した8名」が得られる実績も期間中に何度か更新されます。
詳細は公式ページをご覧ください。


それでは、参加をお待ちしています!

DCSS 0.19日本語版αリリース

この記事は Roguelike Advent Calendar 2017 の24日目の記事です。


DCSS 0.16日本語版リリースから長いことお待たせしましたが、DCSS 0.19日本語版を石鍋試験鯖( http://lazy-life.ddo.jp:8080 )にてリリースしました。
ソースコードGithubで公開しています。軽微な修正を含めた最新のソースコードを入手したい場合はdevelopブランチをどうぞ。


誤訳・未訳箇所、不具合等の報告は以下のコメントフォームにて受けつけています。github issueやtwitter経由でもいいです。


0.16から0.19までに本家で多くの更新がされています。目立つところは↓あたりでしょうか。

  • ヘプリアクルカナ(Hepliaklqana)神、ウスカヤー(Uskayaw)神の追加。
  • プレイヤーから見える範囲が円形から四角形になった
  • 今まで耐毒があれば食べられていた死体の肉が完全に食べられなった
  • アビスでモンスターを倒した際に出口が生成されることがあるようになった
  • テレポート禁止階層の廃止
  • オーク・沼・浅瀬・蛇穴・蜘蛛分岐の階層数減少
  • トロル系やドラゴン系を倒した際には皮ではなく装備できる状態のものが生成される

他、変更の詳細は↓をご覧ください(英語)


DCSS 0.21のリリースが迫っているため次の日本語版は(やるとすれば)0.21ベースになるかと思います。今後もDCSSと石鍋試験鯖をよろしくお願いします。

DCSSトッププレイヤーの設定ファイル拝見

この記事は Roguelike Advent Calendar 2016 の14日目の記事です。


前回前々回の記事で設定ファイル周りをひとくさり書いてみました。

設定ファイルを自分で育てていくのもよいことですが、他人のを見てインスピレーションの助けとするのもいい経験です。
ここでは、先日行われたDCSS 0.19 Tournamentのベスト10プレイヤーの設定ファイルを拝見することにしましょう。

設定ファイルは公開されており*1、誰でも見ることが可能です。

  • Crawl 0.19 Tournament Leaderboard

http://dobrazupa.org/tournament/0.19/overview.html

■Yermak氏

0.18トーナメントに引き続き連覇のYermak氏です。各神・各種族・各職業(・Nemelex choice)でのクリアで獲得した得点が大部分を占めており、オールラウンドプレイヤーと言えるでしょう。

{
local need_skills_opened = true
function ready()
  if you.turns() == 0 and need_skills_opened then
    need_skills_opened = false
    crawl.sendkeys("m")
  end
end
}

ゲーム開始直後に'm'コマンドでスキル割り振り画面を開く機能ですね。毎回要る割に微妙に忘れがちなので便利です。
この例ではready()関数に直で書いていますが、別の関数も呼びたい場合は関数に切り分けるとよいでしょう。

[追記]:この関数は公式配布物のadvanced_optioneering.txtに含まれていたもののようです。

■UltraViolent4氏

message_colorへの設定が異様に多いです。
重要度別に色分けされており、並々ならぬ注力具合が感じられます。

■p0werm0de氏

前半はforce_more_messageへの追記、後半はgammafunk.rc(後述)からforce_more.luaを拝借している様子。

■Dynast氏

デフォルト設定のみ。これで15連続勝利達成というのは驚きです。

■Charly氏

hp_warning = 50以外はほぼデフォルトの模様。

■cosmonaut氏

spell slot設定が多い。後半はHilariousDeathArtist.rc(後述)から拝借しているようです。

■ParticlePhysics氏

force_more_message(--more--を強制するメッセージ)で強敵との出会い頭を警告する記述が主です。

runrest_ignore_messageへの追加で、自動探索中に生肉が腐っても無視して動くような動作になっています。

■hyperimplojin氏

force_more_message、flash_screen_message(画面をフラッシュさせるメッセージ)、auto_exclude(特定の敵を自動移動禁止エリアに指定)への追加に気合いが入っています。

■Manman氏

autoinscribe(アイテムに特定の銘を打つ)の記述が目立ちます。
コメントアウトされていますがhugedmg.rcは多分以下のようなやつですね。ダメージ警告関数の別実装。

include文で同鯖の別アカウントの*.rcファイルをincludeできるのは微妙な気もします。

■shummie氏

後述のHilariousDeathArtist.rcとgammafunk.rcの盛り合わせのようですね。

独自に定義された?skillto()関数は、特定のスキルを指定した数量まで上げるのを監視してくれるようです。
バックラー用に盾スキルをちょっとだけ上げたいとか、そういう時に便利でしょう。さらに低スキルレベル縛りプレイにも。

■その他の設定ファイル

あと、トーナメント上位者ではありませんがReddit等で設定例のおすすめに挙げられていたものを挙げます。

■HilariousDeathArtist.rc

各所で使われている人気のライブラリのようです。

前回の記事で書いた"You take 10 damage, and have 213/223 hp!"等表示するスクリプトもこれ由来だったようです。(HDamage.txtで定義)

■gammafunk.rc

開発チームの一人gammafunk氏のrcfileです。
様々なオプションについて詳細にお役立ち設定が記述され、Luaスクリプトも色々載っています。
そのまま使うもよし、オプションやLuaスクリプトの使い方のサンプルとして使うもよし。

■gretell.rc

プレイヤーの周辺にいる敵のスポイラーを出してくれる関数を提供する設定ファイルのようですが、中身を見ただけでヤバいですね。
qw.rcは200KB足らずでしたが、これは圧巻の600KB超えです。

ただ、現状メンテナンスされておらず0.19-stableではそのままでは動作しない模様。ベタ書きされているデータも古くなっているでしょう。

公式フォーラムでの当時のトピックはこちら。→ https://crawl.develz.org/tavern/viewtopic.php?f=17&t=12011

■終わりに

DCSSの設定ファイルは奥深く、それだけで記事が何本も書けてしまいそうです。
まあ設定ファイルを育てるのもいいけどダンジョンにもちゃんと潜ろうね!(白目)


次の記事はkudzu_naokiさんの「1-Bit Rogueのご紹介」です!


*1:そうでないとトーナメント運営がクラン設定を読めませんからね

DCSS client luaを触る

この記事は Roguelike Advent Calendar 2016 の12日目の記事です。

前回の記事ではLuaスクリプトのお化けのような自動探索botを紹介しましたが、そこまでやりすぎ感を出さなくてもスクリプトを普段のプレイングに役立てていくことは十分に可能です。

とはいえ、Luaの解説をやっていたら本題が進まないため、Luaの文法に関しては以下のサイトを参照してください。

オンラインでLuaスクリプトの動作を確かめられるサイトもあります。

■DCSSにおけるLua

Dungeon Crawl Stone Soup(以下DCSS)の本体はC++で書かれていますが、マップ定義などの編集のしやすさといった利点から、Luaというスクリプト言語も利用されています。

だいたいソースリポジトリツリーのdat/以下にあります。

オンライン版ではLuaファイルを直接いじることはできないため、設定ファイルを介して色々やっていくことになります。

■一行Luaの使い方

設定ファイルの行先頭に : を打つことで、一行Luaスクリプトを使うことができます。
以下のように条件分岐するのが主な使い方です。

: if you.race() == "Ogre" or you.race() == "Troll" then
# オーガとトロルは大岩を拾う
autopickup_exceptions ^= <large rock
: end

you.race()は自種族を示す文字列を返してくれる組み込みAPIです。

■複数行Luaで関数を定義する

もうちょっと複雑な処理をしたい場合、Luaで関数を書いて適宜呼び出しする必要があります。
自分の名前を呼んでくれる関数を組んでみましょう。複数行スクリプトの場合はスクリプト部分を中括弧で囲む必要*1があります。

{
function hello()
    crawl.mpr("Hello, " .. you.name() .. "!")
end
}

crawl.mpr()は文字列を渡すとゲーム中にメッセージとして表示してくれる組み込みAPIです。
you.name()は自分のキャラクター名を返してくれる組み込みAPIです。

実際にゲーム中で呼び出すにはいくつか方法があります。

デフォルトで呼び出される関数を自分で書く
                if (!clua.callfn("ready", 0, 0) && !clua.error.empty())
                    mprf(MSGCH_ERROR, "Lua error: %s", clua.error.c_str());

main.cc 1437行目ですが、コマンド入力ごとに"ready"というLua関数を呼び出すようになっています。つまり、ここを自分で書けばゲーム中でもよろしく呼んでくれるわけです。

{
-- (中略)
function ready()
    hello()
end
}

こんな感じ。
ゲーム中での動作は以下のような感じになります。
まあ、このような毎回表示を行うような関数は実用上は不向きではあります。

前回記事のqw botもready()関数を独自定義することによって「何かボタンを押したら行動」という動作を実現させています。

デフォルトで呼び出される関数を乗っ取る

ゲーム中にTabを押すと最寄りの敵を殴るようになっていますが、これはdat/clua/autofight.luaのhit_closest()関数で定義されており、設定ファイルで上書きが可能です。

{
-- (中略)
-- hit_closest関数上書き
function hit_closest()
    crawl.mpr("Tab pressed!")
    hello()
end
}

Tabを押すたびにこのように表示されるようになります。

マクロから呼び出し

マクロで===に続いて関数名を付加することによって、特定のキーから呼び出せるようになります。


■もうちょっと実用的な例

さすがにハローワールドでは実用性に乏しいので、もう少しゲームに使えそうなのを考えてみます。

ダメージ量警告

DCSSスレの過去ログを眺めていたらこのような投稿がありました。
Dungeon Crawl Stone Soupスレ part8 >>168 より

168 :名@無@し:2014/07/25(金) 22:06:04 ID:???
webtiles見てたら
You take 10 damage, and have 213/223 hp!
という風に受けたダメージ量をメッセージ欄に表示させてた人が居たのですが
こういうのはinit.txtとかを弄ればローカルの環境でも出せるんでしょうか 

今になって考えるとたぶんLuaスクリプトでなんかやってたんでしょうね。組んでみましょう。
どうせなのでついでに、10〜19ダメージなら黄文字、20ダメージ以上で赤文字で出すことにします。

{
local old_hp = -1
local old_mhp = -1

function turn_hp_warning()
    if old_hp < 0 then
       old_hp, old_mhp = you.hp()
    end

    local hp, mhp = you.hp()
    local msg = "You take " .. old_hp - hp .." damage, and have " .. hp .. "/" .. mhp .. " hp!"

    if old_hp - hp >= 20 then
        crawl.formatted_mpr(msg, "danger");
    elseif old_hp - hp >= 10 then
        crawl.formatted_mpr(msg, "warn");
    end

    old_hp, old_mhp = hp, mhp
end

function ready()
    turn_hp_warning()
end
}


WebtileにおけるCtrl-W代替コマンド

ブラウザのアップデートのせいか、最近FirefoxでCtrl+Wをフックしてくれず、「タブを閉じる」が発動してしまうようになりました。
まあゲーム中ならブラウザ側が警告してくれるのでよいのですが、中継地点の設置ができないのは困りものです。
普通のキーマクロだとCtrl+○系のコマンドは直接記述できないようなので、Luaスクリプトで関数を書きましょう。

  • [追記]: マクロでCtrl+○系を使う方法はありました。"\{^W}"を記述するといいです。
{
function set_waypoint()
    crawl.process_keys(control('w'))
end

function control(c)
    return string.char(string.byte(c) - string.byte('a') + 1)
end
}

あとは適当なキーに'===set_waypoint'を登録すればOK。

Repel Missiles自動張り直し

直近のメッセージでRepel Missilesの効果が終了した場合、(失敗率が10%以下なら)自動で張り直します。
もちろんターンは消費するので微妙かもしれません。

{
function recast_rmsl()
    spell = "Repel Missiles"
    if crawl.messages(5):find("You feel your spell is no longer protecting you from missiles.") or
       crawl.messages(5):find("You feel less protected from missiles.") then
        rmsl = spells.letter(spell)
        if rmsl and spells.fail(spell) <= 10 then
            crawl.process_keys("z" .. rmsl .. ".")
        end
    end
end
-- ready()からの呼び出し略
}

■組み込みAPI

Lua側に公開されたDCSS本体のAPIはsource/l_○○.ccで定義されています。
先程使ったyou.name()、you.hp()はl_you.ccに、crawl.mpr()、crawl.formatted_mpr()、crawl.messages()はl_crawl.ccに、spells.letter、spells.fail()はl_spells.ccに、といった感じです。

長くなりすぎるのでこの記事では詳細を省きます。気力が湧いたらなんか書きます(フラグ)

■まとめ

  • Luaスクリプトで普段のDCSSライフのかゆいところに手が届く
  • 設定ファイルをどんどん育てていこう(本末転倒)

さて次の記事はdisさんの「ZinのRecite解析してみたの巻」です!


*1:< 〜 >で囲んでもいいです