第九章(´・ω・`)おばあちゃん、武器スクリプトもっと詳しく☆



・ブヒー

第六章では武器スクリプトの基本的な設定だけに触れたので、今度は全ての設定と、その先にある 武器音声スクリプトや、クライアントスキーム定義についても考えますですブヒブヒー!


「ねえ、俺と一緒に宝クジ買わない?」

(´・ω・`)消えろヴォケ!

・武器スクリプトの詳細

おばあちゃんのMODフォルダ

C:\Program Files\Valve\Steam\SteamApps\SourceMods\Bodycon

こっから更にscriptsフォルダへ下ると武器エンティティ名に拡張子 ".txt"の付いた武器スクリプトがゴロゴロと転がってます。
ちなみにHl2、HL2MP、CS等のゲーム本体ではこの武器スクリプトがICEによって暗号化されたファイル(*.ctx)になって しまったため、パクって来ることができなくなりました、ケチー!
WeaponData
printname 画面上部にある武器選択スロットに表示する武器の名称です。
viewmodel プレイヤー自身から武器を見た際に使用されるモデル(ビューモデル)のファイル名。
playermodel マップ上に転がってたり他のプレイヤーが使用しているのを見た際に使用されるモデル(ワールドモデル)のファイル名。
anim_prefix 今のところ使用目的がモヤモヤとしか分からない、エンジンインターフェイスから モデルに対するアクションシーケンスのリストを引っ張ってきてその中から該当する アクションの番号をピックアップするためのキーワードの接尾辞に使用されていると思われる。 prefixじゃなくてsuffixじゃないか?
たぶん自分の好きなように指定しちゃっていいと思うんだけど。
bucket 武器選択スロットで横方向に左から0ベースに数えて何番目のスロットに武器アイコンを配置するかを指定。
0〜5で指定。6以上を指定しても5になっちゃう。
bucket_position bucketで指定したスロット内で縦方向へ0ベースに数えて何番目に武器アイコンを配置するかを指定。
但し同一スロットに自分よりbucket_positionの小さい武器が存在しない状態では上詰めになる。
clip_size プライマリ攻撃用弾倉に何発装填できるかの指定。
-1指定で無制限。
clip2_size セカンダリ攻撃用弾倉に何発装填できるかの指定。
-1指定で無制限。
default_clip プライマリ攻撃用弾倉に初期状態で装填されている弾数。
default_clip2 セカンダリ攻撃用弾倉に初期状態で装填されている弾数。
weight 武器が選択される優先度。指定値が高い程、武器の自動切換えで選択されやすくなる。
item_flags 特殊な仕様の武器へフラグ設定を行う。(OR加算で複数指定可)。
1 弾が空になっても武器選択スロットでカーソル移動可
2 弾倉が空になっても自動でリロードしてくれなくなる
4 全弾撃ち尽くしても自動で武器が切り替わらなくなる
8 mp_weaponstay 1 に設定しても即武器が復活しない
16 全弾撃ち尽くすと武器の装備自体がなくなる
32 未使用
64 武器を拾っても弾薬取得の表示が出なくなる
damage 武器のダメージ。
showusagehint TF2で使うそうです。
autoswitchto 1に指定すると武器の自動切換え発生時にこの武器を持っていたら絶対選ばれる?
autoswitchfrom 1に指定するとこの武器の使用中に他の武器や弾薬なりを拾うとその武器に切り替わってしまう?
BuiltRightHanded 1に指定するとこの武器が右手仕様であることを示す。
(※)CS用なので使いません
AllowFlipping 1に指定すると強制的にこの武器で左手/右手の切り替えを許す。 (※)CS用なので使いません
MeleeWeapon 1に指定するとこの武器が弾薬不要の近接攻撃武器であることを示す。
でもガッポイスティックのスクリプトにそんなもん書いてないじゃん。いらねえんじゃねえの?
primary_ammo プライマリ攻撃用の弾薬名称。
要らない場合は"None"と書く、もしくはなんも書かない。
secondary_ammo セカンダリ攻撃用の弾薬名称。
要らない場合は"None"と書く、もしくはなんも書かない。
SoundData
14種のカテゴリに分かれた武器音声の指定を行います。ここには武器音声スクリプトの定義済み音声データ名称、 もしくは音声ファイルのパスをそのまま指定します。

武器クラスのコード中では

WeaponSound(SINGLE);

のようにカテゴリの定数定義名称を指定してメンバ関数を呼ぶことにより音声を再生します。
"single_shot"や"reload"以外は末端の武器クラスが好き勝手に使用してる状態なので、コードの変更なしに 単純に新規カテゴリへ音声の指定をおこなっても何も起こりません。
empty ・武器音声カテゴリ定数:EMPTY
弾薬が無い場合のカチカチ音
single_shot ・武器音声カテゴリ定数:SINGLE
プライマリ武器発砲音
single_shot_npc ・武器音声カテゴリ定数:SINGLE_NPC
NPC用プライマリ武器発砲音
double_shot ・武器音声カテゴリ定数:WPN_DOUBLE
セカンダリ武器発砲音
double_shot_npc ・武器音声カテゴリ定数:DOUBLE_NPC
NPC用セカンダリ武器発砲音
burst ・武器音声カテゴリ定数:BURST
バースト射撃の音声
reload ・武器音声カテゴリ定数:RELOAD
リロード時の音声
reload_npc ・武器音声カテゴリ定数:RELOAD_NPC
NPC用リロード時の音声
melee_miss ・武器音声カテゴリ定数:MELEE_MISS
近接攻撃空振り音声
melee_hit ・武器音声カテゴリ定数:MELEE_HIT
近接攻撃ヒット音声
melee_hit_world ・武器音声カテゴリ定数:MELEE_HIT_WORLD
既存クラスではMELEE_HITしか使用されていないので他の目的に使用してしまっても問題ない
special1 ・武器音声カテゴリ定数:SPECIAL1
上記以外で何か特別音を出したい場合に指定
special2 ・武器音声カテゴリ定数:SPECIAL2
上記以外で何か特別音を出したい場合に指定
special3 ・武器音声カテゴリ定数:SPECIAL3
上記以外で何か特別音を出したい場合に指定
TextureData
TextureData内の各グループに属する設定は2種類の方法があります。

・フォントと文字を指定する場合
font クライアントスキームの定義済みフォント名称を指定します。 その定義済みフォント名称については後ほど詳しく調べましょう。
character アイコンや照準として使用する「文字」。2文字以上指定しても先頭の文字だけが対象となる。


・スプライト、テクスチャ類を指定する場合
file アイコンや照準として使用するスプライトやテクスチャのファイル名を materialsフォルダからの相対パス記述で指定します(.vmtと.vtfのペアなので拡張子抜き)。
x 配置するX座標。
y 配置するY座標。
width 幅。
height 高さ。

以下がTextureDataで設定する各グループです
weapon 武器選択スロットに表示する武器のアイコン
weapon_s 武器選択スロットで武器選択のカーソルがこの武器に合わさった場合に通常の武器アイコンと 共に表示する(強調表示の目的につかってます)
ammo プライマリ武器の弾薬アイコン
ammo2 セカンダリ武器の弾薬アイコン
crosshair 照準
autoaim AUTOIMの照準
zoom ズーム時の照準
zoom_autoaim ズーム時のAUTOAIM照準

・武器用音声スクリプト


「ジブン、武器用ですから」

(´・ω・`)Fuck You!


武器スクリプトのSoundDataで各武器音声カテゴリに対して指定されている武器音声スクリプトの定義済み音声データ名称
weapon_ar2.txtの例
"reload"		"Weapon_AR2.Reload"
"single_shot"	"Weapon_AR2.Single"

これらはどこに定義されているんでしょうか?

武器スクリプトと同じフォルダ下に

game_sounds_weapons.txt

って名前のファイルがあるので開いてください。そこで試しに"Weapon_AR2.Single" を検索してみると・・・
game_sounds_weapons.txtの一部
"Weapon_AR2.Single"
{
	"channel"		"CHAN_WEAPON"
	"volume"		"0.8"
	"soundlevel"	"SNDLVL_GUNFIRE"
	"pitch"		"85,95"

	"rndwave"
	{
			"wave" "weapons/ar2/fire1.wav"
	}
}
めっけたー!

めっけたのはいいのだけれど、何を設定してるんでしょうね。
channel 音声再生時に使用するチャンネルを指定します。

CHAN_AUTO
チャネル自動選択

CHAN_WEAPON
武器音声用チャンネル

CHAN_VOICE
会話音声用チャンネル

CHAN_ITEM
アイテムの音声用チャンネル

CHAN_BODY
エンティティ本体から音を発する場合等に使用するチャンネル

CHAN_STREAM
ストリーミング再生に使用するチャンネル、ただ、会話音声等はCHAN_VOICEを通して 音声の属性をストリーミング再生に指定して現在使用されているようなので、このチャンネルは 未使用の可能性がある

CHAN_BODY
静的エリアに配置される音声用チャンネル

volume 原音に対する音量のスケールを指定、0.0で無音、1.0で原音そのままのレベルを意味する。

値は1個、または2個をカンマ区切りで指定。
2個指定時には再生毎に両者の範囲でvolumeの値がランダムに変化する。

こんな指定もできます
VOL_NORM (== 1.0)
pitch 0〜255の範囲で原音に対する音程の変化量を指定、100でピッチ変更無しのニュートラル。

値は1個、または2個をカンマ区切りで指定。
2個指定時には再生毎に両者の範囲でpitchの値がランダムに変化する。

こんな指定もできます
PITCH_LOW (== 95)
PITCH_NORM (== 100)
PITCH_HIGH (== 120)
soundlevel 音声出力レベル(dB)。大きく指定するほど音圧が上がって音声の減衰率が下がる
右側に書いてあるのはどれぐらいの音に相当するかの目安です

SNDLVL_NONE (== 0dB)
SNDLVL_20dB (== 20dB) カサカサ音
SNDLVL_25dB (== 25dB) ささやき声
SNDLVL_30dB (== 30dB) 図書館
SNDLVL_35dB (== 35dB)
SNDLVL_40dB (== 40dB)
SNDLVL_45dB (== 45dB) 冷蔵庫
SNDLVL_50dB (== 50dB) 家の中
SNDLVL_55dB (== 55dB)
SNDLVL_IDLE (== 60dB)
SNDLVL_60dB (== 60dB) 普通の会話
SNDLVL_65dB (== 65dB) 洗濯機、食器洗い機
SNDLVL_STATIC (== 66dB)
SNDLVL_70dB (== 70dB) 自動車、掃除機、ミキサー、電動ミシン
SNDLVL_NORM (== 75dB)
SNDLVL_75dB (== 75dB) 交通渋滞
SNDLVL_80dB (== 80dB) ミニバイク、目覚まし時計、騒がしいレストラン
SNDLVL_TALKING (== 80dB)
SNDLVL_85dB (== 85dB) 工場、髭剃り機
SNDLVL_90dB (== 90dB) 赤ちゃんの鳴き声、バイクの通過、オープンカー
SNDLVL_95dB (== 95dB)
SNDLVL_100dB (== 100dB) 地下鉄、ディーゼルトラック、製材所, ボイラー
SNDLVL_105dB (== 105dB) ヘリコプター、芝刈り機
SNDLVL_110dB (== 110dB) スノーモービル、モーターボートに乗ってる時、砂吹き機
SNDLVL_120dB (== 120dB) 自動車のホーン、プロペラ機
SNDLVL_130dB (== 130dB) 空襲警報
SNDLVL_GUNFIRE (== 140dB) 発砲音、ジェットエンジン
SNDLVL_140dB (== 140dB)
SNDLVL_150dB (== 150dB)
SNDLVL_180dB (== 180dB) ロケット打ち上げ
wave

または

rndwave
音声ファイルの指定を行います。ファイル名はsoundフォルダからの相対パス記述 で拡張子も含めた形で使用(指定できるのはWAV(*.wav)とMP3(*.mp3)形式のファイル)。
ファイル指定の記述には以下の2種類があり、どちらかの形で記述します。

音声ファイルを単一指定する場合

記述例:
"wave" "weapons/ar2/ar2_reload.wav"

ランダム再生用に音声ファイルを複数指定する場合
"rndwave"に続けて中括弧で囲った中へファイル名を記述 この指定方法では再生毎に音声ファイルがランダムに選択されます

記述例:
"rndwave"
{
	"wave" "weapons/shotgun/shotgun_reload1.wav"
	"wave" "weapons/shotgun/shotgun_reload2.wav"
	"wave" "weapons/shotgun/shotgun_reload3.wav"
}


ファイル名を記述際にはその先頭に「サウンドキャラクタ」を2文字まで指定でき、 このサウンドキャラクタを指定することによって各音声に色々な属性を付加することができます
* 音声のストリーミング再生を指定、会話音声のような長いデータをまともに再生させると メモリが爆発してしまうので必ず指定します。
特に"vo"フォルダ下の音声再生時にこれを指定しないと、DLL側からチェックが入って弾かれるようです。
? ユーザボイス?VOIPに関係あるのかと思い、試しに使ってみたらHL2が落っこちやがったよバロー。
! scripted_sentenceエンティティで使用するためなのかどうなのかいまいち不明です。
どの道マルチプレイでイラネーヨ
# 音声をバイパス出力。各種エフェクトをくぐらせずに出力したい類の音声(BGM等)に指定する。
> ドップラー効果を表現するための音声に対して指定する。
あらかじめ以下の構成を持つステレオ形式の音声データを用意する必要あり。

LEFT:接近してくる際の高周波音声
RIGHT:遠ざかっていく際の低周波音声


データの1例(弾が側をかすめていく時の音声)、上側のLEFTには「ヒュン」、 下側のRIGHTには「ヒュン」という音が入ってます。って文章でかいても違いわかんないじゃーん。
< 聞こえてくる方向によって音声を変化させる効果を表現するための音声に対して指定する。
あらかじめ以下の構成を持つステレオ形式の音声データを用意する必要あり。

LEFT:真正面から聞こえた際の音声
RIGHT:真後から聞こえた際の音声
^ 距離によって音声を変化させる効果を表現するための音声に対して指定する。
あらかじめ以下の構成を持つステレオ形式の音声データを用意する必要あり。

LEFT:近距離で聞いた際の音声
RIGHT:遠距離で聞いた際の音声


データの1例(爆発音)、上側のLEFTには「バン〜!」、 下側のRIGHTには「ズン〜!」という音が入ってます。って文章でかいても違いわかんないっつってんじゃーん。
@ 指定すると聞こえる方向によって音場が変化せずに元のファイルを聞いた時と同じ状態で聞こえる。
) 空間ステレオ効果で音に広がりを持たせる。
} 単純にPCMデータを間引いたり、ダブらせることによってピッチを変化させる方法を使う。

例えばBGMに使用するmp3ファイルを指定したいよ〜♪な場合にはこのようなサウンドキャラクタ指定を行います(バイパス出力、ストリーミング再生)。
"wave" "*#music/hanamogera.mp3"


他に、ファイル名のパス記述中に"$gender"を書いておくと、音声再生元のエンティティが人間のモデル を使用していたら自動的に"$gender"を"male"、"female"に置換してくれる仕組みもあるとかないとか。


(´・ω・`)ねーねー、こんな面倒な定義書かなくても、武器スクリプトに直接ファイル名書いちゃダメなん?

・・・と思うかもしれませんけど、ダーメですね、なぜダメなのかというと
  • 使用チャンネルの指定がCHAN_AUTOになってしまい、武器音声チャンネル以外の チャンネルの音声再生を阻害したり、自身の武器音声を後発で再生した武器音声で打ち消せずに重なってしまったりする恐れがあります。
  • マシンガン等、複数の発砲音を持つ物は本来1つの武器音声カテゴリを使えば済むところを他のカテゴリも食いつぶさなければならなくなります。
  • マシンガン等、複数の発砲音を持つ物のランダム再生処理のコードを自前で書くハメになります。めんどくせー。
  • 音量、音程を変更する場合、毎回毎回、直接音声ファイルを加工しなおさなければなりません。


  • ヘドが出てしまうような弊害炸裂でどうしようもなくなります。なので、武器スクリプトへ直接ファイル名を書くのは絶対にやめましょう。

    ・クライアントスキームのフォント定義


    「これでも昔はビックリマンとか集めてたんですよ」

    (´・ω・`)知るか!Asshole!!


    武器スクリプトのTextureDataでアイコンや照準をfontとcharacterの組み合わせで設定しているものはこんな記述になってますよね。
    weapon_ar2.txtの例
    "weapon"
    {
    	"font"		"WeaponIcons"
    	"character"	"l"
    }
    

    ここで思ったはずです「"l"ってなんだよ?」

    その謎を解くために、上記の例で指定されているフォント"WeaponIcons"の定義を見てみます。

    おばあちゃんのMODフォルダ

    C:\Program Files\Valve\Steam\SteamApps\SourceMods\Bodycon

    こっから更にresourceフォルダへ下ったとこにある以下のファイル

    ClientScheme.res

    こいつをテキストエディタで開いて(間違ってダブルクリックしちゃうと勝手にVSで開き行っちゃうよウゼー) WeaponIconsを検索してみます。
    ClientScheme.resの一部
    WeaponIcons
    {
    	"1"
    	{
    		"name"		"HalfLife2"
    		"tall"		"64"
    		"weight"		"0"
    		"antialias" 	"1"
    		"additive"		"1"
    		"custom"		"1"
    	}
    }
    

    あったー。

    それではクライアントスキームの定義のうち、今回はFontsとCustomFontFilesに絞って設定内容の意味をみてみます。
    Scheme
    Fonts
    [フォント定義名称]
    [定義番号(1 〜)]
    name フォント名
    tall フォントサイズ
    weight 文字の太さ、通常は0を指定。
    100,200,300,400,500,600,700,800,900,1000のように100刻みで数値を指定する。
    blur 文字がぼやける度合を指定、通常は0(ぼやけ無し)。
    大きな値を指定するほど、ぼやけ効果が大きくなる。
    antialias 文字の角を滑らかに描画したい場合には1を指定する。
    通常は0を指定。
    scanlines 走査線表示の間隔、通常は0を指定(走査線表示なし)。
    additive 文字の輝度を上げる、通常は0を指定。
    1を指定すると輝度が上がるが、それより大きくしても変化があるとは思えなかった。
    custom nameに指定したフォントがカスタムフォントの場合に1を指定する。
    range 使用可能な文字コードの範囲指定。同じフォント定義名の元に複数の フォント設定が定義されている場合に、最適なフォント設定を選択するための条件提示だと思われる。
    何も指定しなければ範囲指定なし。
    yres 使用可能な画面の解像度。同じフォント定義名の元に複数の フォント設定が定義されている場合に、最適なフォント設定を選択するための条件提示だと思われる。
    何も指定しなければ解像度指定なし。
    CustomFontFiles
    [定義番号(1 〜)] フォントファイル名。
    カスタムフォントファイルはresourceフォルダ下へ配置されています。

    上の情報を元に「"l"ってなんだよ?」を探って見ましょう。
    WeaponIconsは1つしかフォント設定の定義を持っていませんから使用されるフォント 設定は常に1つです。また、

    "custom" "1"

    に設定されているので、クライアントスキームファイルClientScheme.resの末尾に定義 されているカスタムフォントの設定に列挙された、いずれかのTrueTypeフォントファイル中に"HalfLife2"という フォントがあるはずなのです。
    ClientScheme.resの一部
    CustomFontFiles
    {
    	"1"	"resource/HALFLIFE2.ttf"
    	"2"	"resource/HL2MP.ttf"
    	"3"	"resource/HL2crosshairs.ttf"
    }
    


    確認のためにフォントをOSにインストールしちゃってください。
    フォントのファイルはHalf-Life2の本編、Half-Life DMいずれかのresourceフォルダの下に見つかりますよ。
    C:\Program Files\Valve\Steam\SteamApps\××××\half-life 2\hl2\resource


    C:\Program Files\Valve\Steam\SteamApps\××××\half-life 2 deathmatch\hl2mp\resource


    まさか今更こんな人はいませんよね?

    「フォントはどうやってOSにインストールするんだい?」

    (´・ω・`)うっせーボケ!今すぐ本屋に駆け込んで「はじめてのウインドウズ」やら「ウインドウズ入門」むさぼり読んでこいや!


    さて、今ではすっかり使わなくなってしまったワードパッドを久しぶりに起動したら、フォント選択のコンボBOXで"HalfLife2" を探します。

    オーイェー!

    フォントを選んだらエディタ部へ"l"を打ち込んで見ましょう。すると・・・

    ん?なんだこれ?

    よくわかんないんでフォントを拡大・・・

    ズーガーン!!ガッポイライフルだ

    そうなんです「"l"ってなんだよ?」の"l""l"そのものだったんですよ。


    (´・ω・`)つ次へ