cfg / console についての基礎 (草稿)

更新履歴

目次

初級編 コンソールと簡単なコマンドについての解説

コンソールとは何か

コンソールとは開発者用に用意された、文字により対話するためのインターフェースである。

コンソールに何か文字列を入力すると Source Engine がその文字列を読みとり、それが特定のキーワードに合致する場合は、それが実行され L4D 世界に反映される。

コマンドとは何か

コンソールに文字列を入力した際に、それがあらかじめ定義されている特定のキーワードだった場合に、なんらかの作用が L4D 世界に発生する。この時のキーワードのことをコマンドと呼ぶ。これは英語表記で command、省略表記で cmd とよく表現されている。

コマンドにはオプションとして値を加えることができる。たとえば

] echo 1

という入力値があった場合、echo がコマンド (command) であり、1 が引数 (argument) である。1 は echo コマンドに渡される引数であり、「echo コマンドは引数をコンソールに出力する」という機能であるため、これはコンソールに 1 と出力される。これを一般的に “引数” と呼ぶ。英語表記で argument、省略表記で arg や args とよく表現される。

cfg とは何か

cfg とは config の略であり、日本語でいうと設定ファイルのことである。L4D は起動すると、cfg/autoexec.cfg が自動的に読み込まれるようになっている。そしてそれは先ほど説明した、コンソールにて一行ずつ読み込まれ評価されている(と考えるとよい)。

autoexec.cfg とは何か

L4D2 の起動時に自動的に読み込まれるファイルであり、ファイルパスは次の場所にある。

./left4dead/cfg/autoexec.cfg

userconfig.cfg とは何か

通常、設定は cfg/autoexec.cfg に記述すればよいが、何か問題があったときに簡単に元に戻せるように、FPS ゲーマーには自分独自の設定ファイルを作成する風習がある。そのファイル名がよく userconfig.cfg と名付けられている。

cfg/autoexec.cfg に

exec userconfig.cfg

このように記述し、自分独自の設定は userconfig.cfg に書くという “風習がある”。強調しておくが、あくまでも userconfig.cfg という名前にしなければならないというわけではないし、そもそもこのファイルを使う必要もない、autoexec.cfg にそのまま記述すればよい。がそういう風習があるというだけの話である。

この名前はもちろん自由に変更可能であり

exec test.cfg

としておけば test.cfg に自分独自の設定を記述できる。exec は引数に指定されたファイル名の cfg ファイルをコンソールに読み込む、という機能がある。

command を実行する

コンソールに command の名称を入力すると、その機能が実行される。構文は

command arguments...

であり arguments は複数指定できる。複数ある場合は空白で区切る必要がある。例を示す。

command argument1 argument2 argument3

またダブルコーテーション (") で囲むことによりひとつの塊であるということを処理系に指示できる。

command "argument1 argument1" argument3

この場合、command に渡される引数は、“argument1 argument1” と “argument3” の二つである。

command を連続的に複数実行させる

command1; command2

とセミコロンで区切ることにより、一行に複数のコマンドを入力することが出来る。こうしておくとたとえば command1 を実行した後に command2 を実行する等といったことが出来る。

例を出すと

] echo 1; echo 2

とコンソールに入力すると

1
2

といったようにコンソールに出力される。

これは、wait コマンドを使用するとさらにわかりやすくなる。この wait コマンドの詳細に関しては後述するが、簡単に言うと指定された時間が経過するまで待つ (wait) という機能である。

] echo 1; wait 90; echo 2
1
2

↑この出力だけではわかりにくいが 1 が出力された後、すこし時間を置いて 2 が出力されるのがわかるだろうか。

alias コマンド

alias というコマンドは、英語の alias という単語そのものの機能/意味が割り当てられており、“コマンドに別の名称をつける” という機能である。

構文は

alias 新しい名前 command...

である。command は複数でもかまわない。

※ただし複数である場合はダブルコーテーションで囲むことによりひとつの塊であるということを指示したほうがよい。

たとえば alias コマンドの使用例を出すと

alias "notify_zombie" "echo zombies!"

とすると以後 notify_zombie と入力するだけで、“echo zombies!” と入力と同じことになる。実際に実行してみよう、以下の例が実際にこれを実行してみた例である。

] alias "notify_zombie" "echo zombies!"
] notify_zombie
zombies!

もちろんセミコロンで複数のコマンドを 1 つのエイリアスにまとめることもできる。

] alias "test_alias" "echo 1; echo 2"
] test_alias
1
2

これだけでは alias の価値がわかりにくいかもしれないので、より現実に沿った例を出す。たとえば通常感染者(L4D の一般ゾンビ)を 10 匹発生させたい場合、単純に考えると以下のようなコマンドでできる。

] z_spawn;z_spawn;z_spawn;z_spawn;z_spawn;z_spawn;z_spawn;z_spawn;z_spawn;z_spawn

z_spawn とは、照準の位置に通常感染者を発生させるというコマンドである。これを毎回入力していると心が折れるので以下のようにエイリアスでひとつのコマンドにまとめる。

] alias zombie_10piki "z_spawn;z_spawn;z_spawn;z_spawn;z_spawn;z_spawn;z_spawn;z_spawn;z_spawn;z_spawn"

このようにまとめておけばたとえば 100 匹通常感染者を生成したい場合は以下のようにするだけで出来る。これを z_spawn だけでやった時のことを考えると想像を絶する苦労がありそうだ。

] alias zombie_100piki "zombie_10piki;zombie_10piki;zombie_10piki;zombie_10piki;zombie_10piki;zombie_10piki;zombie_10piki;zombie_10piki;zombie_10piki;zombie_10piki;"

bind コマンド

bind というコマンドは、コマンドとキー入力を対応させるためのコマンドである。構文は以下のようになる。

bind キー コマンド

この場合、キーが入力されたときにコマンドが実行されるようになる。

たとえば

] bind "k" "echo 1"

とすると、k キーが押されたときに “echo 1” というコマンドが実行される。echo 1 は、1 をコンソールに出力するという意味なのでコンソールに 1 と出力される。

また bind コマンドは先ほど説明した alias コマンドにより定義された “別名” も使用できる。これにより読みやすい cfg ファイルを作成することが出来る。

] alias test_alias "echo 1"
] bind "k" test_alias
] k
1

出力結果は先ほどと同じようにコンソールに 1 と出力される。

wait コマンド

wait 数値

wait コマンドは指定された数値フレーム分待つという意味がある。wait 80 であれば 80 フレーム経過するのを待つ。基本的に他のコマンドと組み合わせて使用する。

] echo 1; wait 60; echo 1;
1
1

1 とコンソールに出力された後、60 フレーム後に再度 1 と出力される。

GSD BBS Reader には FPS を固定化してくれる機能があるのでそれを利用すると wait の時間が調整しやすくなる。たとえば 60FPS 固定にした場合

] echo 3; wait 60; echo 2; wait 60; echo 1;
3
2
1

このようにして、3, 2, 1 と 1 秒ごとにカウントダウンするスクリプトを作成可能。

中級編 頻出コマンド解説

find コマンド

find コマンド名

find コマンドは指定された文字列が含まれるコマンドを検索し、一覧表示してくれるコマンドだ。たとえば find echo とすると echo という文字が含まれるコマンド、echo と sv_logecho が表示される。またコマンドの説明文の文字列からも検索してくれるのも便利でよい。

コマンドをなんとなく覚えている時や、新しい面白いコマンドを探すときに便利。またコマンドの説明も表示されるのもとても使いやすい。

"echo"
 server_can_execute
 - Echo text to console.

"sv_logecho" = "1"
 archive
 - Echo log information to the console.

たとえば Valve がデバッグのために用意した cvar(ゲームの設定値)が知りたいときは find debug とするだけで大体それっぽいのが見つかる。

help コマンド

help コマンド名

コマンドの説明を表示、そのコマンドにて設定可能な最大値や最小値なども表示されるためとても参考になる。

たとえば以下は cl_interp コマンドの説明文を表示してみた例。

] help cl_interp
"cl_interp" = "0.100000" ( def. "0.1" ) min. 0.000000 max. 0.500000
 client user
 - Sets the interpolation amount (bounded on low side by server interp ratio settings).

incrementvar コマンド

incrementvar 変数名 最小値 最大値 増減値

指定された変数の最小値と最大値までの範囲を、指定された増減値で繰り返させるというコマンド。

incrementvar hoge 1 10 1 とすれば、このコマンドを実行するたびに hoge 変数の値が 1 から 10 まで 1 ずつ値が増えていって、10 になったら次の実行では 1 になる。

incrementvar hoge 10 1 -1 とすれば、このコマンドを実行するたびに hoge 変数の値が 10 から 1 まで 1 ずつ値が減っていって、10 になったら次の実行では 1 になる。

これを使うと net_graph の切り替え bind を作ったり、glowing script を作成するときに簡潔な cfg を記述することが出来る。

toggle コマンド

toggle cvar(変数名)

exec コマンド

exec configファイル名

外部の cfg ファイルを読み込む。読み込まれるのは、left4dead/cfg/指定したファイル名.cfg。

say コマンド

say 文字列

指定された文字列を全体チャットに書き込みます(発言します)。

say_team コマンド

say_team 文字列

指定された文字列をチームチャットに書き込みます(発言します)。

+mouse_menu コマンド

+mouse_menu マウスメニュー名

指定されたマウスメニューを開きます。デフォルトだと QA(QA 系ラジオメニュー)と Orders(報告系ラジオメニュー)しかありませんが、scripts/radialmenu.txt をいじると自分で追加/改造することが出来ます。

lastinv, nextinv, previnv

武器持ち替えに関するコマンドです。

lastinv = 最後に持っていた武器
nextinv = 次の武器
previnv = 前の武器

slot1 ~ slot10 で、任意のスロットの武器を装備可能です。L4D2 ではそれぞれ以下のようになっています。

slot1 = プライマリウェポン
slot2 = サブウェポン
slot3 = 火炎瓶/パイプボム/ブーマー汁
slot4 = 救急キット
slot5 = ピル/アドレナリン
slot6 ~ slot10 = 未使用

cl_interp

ラグ補正に関する設定です。デフォルトは 0.1 で、これは 100 ミリ秒間サーバーからのデータをバッファするということです。そのためクライアントに描画される L4D 世界は、100 ミリ秒間サーバーよりも遅延しているということでもあります。

この値の最小値は cl_interp_ratio と cl_updaterate との関連性によって変わります。詳細については別の記事を記載する予定ですが、必ずしもこの値を小さくすれば良いというわけではありません。なぜならサーバーはユーザーの cl_interp の値に基づいてラグ補正をしているからです。つまり cl_interp を単純に下げてほかのプレイヤーよりも優位に立とうとしても、下げた分だけサーバー側のラグ補正の仕組みによって時間が巻き戻され調整することにより、損をするようになっているということです。

上級編 マニアックなコマンド解説

特別な意味を持つ bind の +/- について

キーが押されている間なにかしたかったり、キーが離されたときに何かしたかった場合はこの項を読む必要がある。bind で指定する際の + と - には特別な意味があり

bind key +command

とすると、この例の場合では、該当する key が押されたときに +command という名前の alias が実行されて、該当する key が離されたときに -command という名前の alias が実行されるようになる。

例をだすと

] bind "z" "+key"
] alias "+key" "echo press_key" // key押したとき
] alias "-key" "echo release_key" // key離したとき

この場合は、z キーを押したときに +key が実行され、z キーを離すと -key が実行される。

ちなみにだが、bind に指定したコマンド名が “+key” などと単一のものであった場合に限りこの機能が有効になるようで、"+key; wait" などと複数指定してあった場合は無効になってしまう。

] bind "z" "+key; wait"

となっていた場合、-key が実行されることはないのだ!

+lookspin(180 度回転 / 反転)コマンドについて

このコマンドは、その場で 180 度回転(反転)できるコマンドである。通常のコマンドと同じような次のような bind をすることで利用できる。

] bind "z" "+lookspin"

このコマンドは xbox360 のコントローラー(ほかの Joystick でもおそらく可能)を有効にしている状態でなければ使用できない。正直用途は少なく、反転 Charger や Hunter の壁蹴りや生存者の殴りの効率化に利用できるくらいなのであまり使えない。

スクリプトサンプル紹介

※ wait を使っている箇所がいくつかあるが、この値はプレイしているゲーム環境の平均 FPS によって変更する必要がある。私の環境は 90FPS に固定化しているため、この記事に出てくる wait はすべて 90FPS 向けの wait 値となっている。この値はあなたの環境に合わせて変更しなければならないが、比例の式(小学校で習う)を利用すれば簡単に求めることが出来るので各自計算してほしい。

Tank の岩投げ殴り(使ってないので未確認)

alias "z_tank_iwanage_naguri" "+attack; +attack2; wait 25; -attack2; -attack;"
bind "MOUSE4" "z_tank_iwanage_naguri"

Tank のジャンプ岩投げ殴り

alias "z_tank_jump_iwanage_naguri" "+attack; +attack2; wait 5;  +jump; wait 25; -jump; -attack2; -attack;"
bind "MOUSE4" "z_tank_jump_iwanage_naguri"

無限ライトチカチカスクリプト

alias r_flushR r_flush1
alias r_flush1 "impulse 100; wait 5; r_flush2"
alias r_flush2 "impulse 100; wait 5; r_flushR"
alias "+r_flush" "alias r_flushR r_flush1; r_flushR"
alias "-r_flush" "alias r_flushR" // nop
alias "t_flush" "t_flush1"
alias "t_flush1" "+r_flush; alias t_flush t_flush2"
alias "t_flush2" "-r_flush; alias t_flush t_flush1"
bind "f" "t_flush"

アイテムの名前を叫びつつアイテムを取る

現在見ているものを RC(ラジオチャット/L4D ではキャラクターの発言)で発言するには vocalize SmartLook コマンドを使用します。アイテムを拾う/使うには +use で Ok です。

bind "e" "+use_look"
alias "+use_look" "+use; vocalize SmartLook"
alias "-use_look" "-use"

3 点バースト / 高速連射モード

// default -> quick fire -> 3 ten burst -> default
// quickfire
alias +quickfire "+rs"
alias "+rs" "alias reps +rsse;+rsse"
alias "+rsse" "+attack;wait 3;-rsse"
alias "-rsse" "-attack;wait 3;reps"
alias "reps" "+rsse"
alias -rs "alias reps none"
alias -quickfire "-rs"

//alias r_quickfireR r_quickfire1
//alias r_quickfire1 "+attack; wait 3; r_quickfire2"
//alias r_quickfire2 "-attack; wait 3; r_quickfireR"
//alias "+r_quickfire" "alias r_quickfireR r_quickfire1; r_quickfireR"
//alias "-r_quickfire" "alias r_quickfireR" // nop
//bind "MOUSE1" "+r_quickfire"

// repeat 4 ten burst
alias "+burst" "+attack; wait 40; -attack" // 4 ten burst
alias "-burst" "-attack" // 4 ten burst
alias r_burstR r_burst1
alias r_burst1 "+burst; wait 30; r_burst2"
alias r_burst2 "-burst; wait 30; r_burstR"
alias "+r_burst" "alias r_burstR r_burst1; r_burstR"
alias "-r_burst" "alias r_burstR" // nop

// toggle burst mode
alias "t_burst" "t_burst1"
alias "t_burst1" "bind MOUSE1 +quickfire; say_team quick fire mode; alias t_burst t_burst2"
alias "t_burst2" "bind MOUSE1 +r_burst; say_team 4 burst mode; alias t_burst t_burst3"
alias "t_burst3" "bind MOUSE1 +attack; say_team normal mode; alias t_burst t_burst1"

bind "g" "t_burst"

モロトフフェイント

モロトフを投げるフリをしてやっぱりやめる、という一連の流れをワンボタンで出来るようにしたもの。

// molotov feint
alias "molotov_feint" "slot3; +attack; wait 200; -attack; lastinv;"

カウントダウンスクリプト

3, 2, 1 とカウントダウンして go とチームチャットで発言するスクリプト。ボイスチャットのない野良で、マンホール降りるときなんかに使えるスクリプト。

alias "countdown_rdy" "say_team countdown start; wait 90; wait 90; say_team 5; wait 90; say_team 4; wait 90; say_team 3; wait 90; say_team 2; wait 90; say_team 1; wait 90; say_team go"

くるくる回転スクリプト(AFK 対策)

その場でくるくる回転するスクリプトです。AFK というのは Away from keyboard(キーボードからはなれている)、つまりどっか行っちゃったときに何の入力もないと休憩中状態になってしまうので、その対策のためにその場でくるくる回転するというスクリプトです。

alias "t_kurukuru" "t_kurukuru1"
alias "t_kurukuru1" "+left; alias t_kurukuru t_kurukuru2"
alias "t_kurukuru2" "-left; alias t_kurukuru t_kurukuru1"
bind "h" "t_kurukuru"

+left や +right コマンドでマウスが動かせます。

スクリプト作成 FAQ

キーを押したときと離したときに何かをしたい

bind の +/- 機能を利用してください、この記事の別の項目にて詳細を記述しましたので、そちらを参照ください。

キーを押している間だけ何かを行いたい

bind の +/- 機能を利用してください、この記事の別の項目にて詳細を記述しましたので、そちらを参照ください。

機能を切り替えたい(トグル / toggle)

alias "t_item" "t_item1"
alias "t_item1" "alias t_item t_item1; say item1"
alias "t_item2" "alias t_item t_item2; say item2"

t_item を実行するごとに、t_item の alias が t_item2, t_item1, t_item2… と変わっていきます。say item1 と say item2 となっているところを変更すれば任意のコマンドをトグルで実行できます。

以下は簡単な例ですがディレクター(L4D の展開を制御する AI)の ON/OFF を切り替えるスクリプトです。

alias "t_director" "t_director1"
alias "t_director1" "director_stop; say director stop; alias t_director t_director2"
alias "t_director2" "director_start; say director start; alias t_director t_director1"

t_director を bind したキーを押すごとにディレクターの有効/無効が切り替わります。

無限に何かを行いたい(ループ / loop)

まず無限ループを作成するとわかりやすいです。以下のような alias を作ると無限にコマンドを実行できます。loop という alias の中で loop という alias を実行してるので無限に実行されてしまうのです。

] alias loop "echo test!; loop"
] loop
test!
test!
test!
test!
....

このままだと無限に実行されてしまうため、どこかで終了条件を設定する必要があります、当たり前ですがそうしないと実用性が低いです。ここでは別の alias を実行するとループがとまるように改造してみましょう。loop_stop という名前で作ってみましょう。none という alias と、loop_stop という alias を追加することにします。none は何も実行しないという alias で、loop_stop では、loop の中身を none に設定しています。loop の中で loop が実行されることにより、無限に続いていたループがあるので、それを断ち切るために loop の中身を何もしない none に設定することにより終了させているのです。

] alias loop "echo test!; loop"
] alias none ""
] alias loop_stop "alias loop none"
test!
test!
test!
test!
] loop_stop

次はこれをキーで制御出来るようにしてみましょう。キーを押している間だけ無限ループをさせて、離したときに終了するものです。キーを押している間だけ何かを実行するには、bind の +/- 機能を利用します。bind については別の項目で詳細を解説しているのでそちらを参照してください。

alias r_flushR r_flush1
alias r_flush1 "impulse 100; wait 5; r_flush2" // impulse 100でライトON/OFFトグルできます
alias r_flush2 "impulse 100; wait 5; r_flushR"
alias "+r_flush" "alias r_flushR r_flush1; r_flushR"
alias "-r_flush" "alias r_flushR" // nop

複数キー同時押しバインドの作り方

たとえば SHIFT キー + 数字キー、の例で説明します。SHIFT キーを押している間だけ読み込まれる設定ファイルを作成しそこで既存の bind を上書きします。

まず普通の userconfig.cfg を作ります。次に SHIFT キー押している時だけ読み込まれる cfg を作ります。ここでは、shift_key.cfg とします。

userconfig.cfg には以下を記述します。

alias "+go_shift_mode" "exec shift_key"
alias "-go_shift_mode" "exec userconfig"
bind "SHIFT" "+go_shift_mode"
bind "1" "slot1"
bind "2" "slot2"

次に、shift_key.cfg

bind "1" "echo 1"
bind "2" "echo 2"

こんな感じです。

念のため再度解説しておくと shift キーを押したときに、+go_shift_mode が実行され、shift_key.cfg が読み込まれます。そして bind “1” が上書きされますので、SHIFT+1 のときは、shift_key.cfg の bind “1” が実行されます。shift キーを離すと、-go_shift_mode が実行され、userconfig.cfg が実行されますので、普段の bind “1” は、userconfig.cfg のものになります。