.マップ設定ファイル 説明書

	2005/04/22	初版	smod28b対応
	2005/05/16	２版	smod29対応
	2005/06/09	３版	smod29b対応
	2006/02/11	４版	smod36対応
	2006/07/13	５版	smod37対応

..マップ設定ファイルの概要

...	マップ設定ファイルについて
	マップ設定ファイルとは、既製マップのデコンパイルなどを一切せずに、敵等を
	配置する為のファイルです。
	これによって、出来の良いデスマッチマップをシングルプレー可能にしたり、本
	編にないシチュエーションを追加することが可能となります。

	もともと敵を配置するだけの処理でしたが、拡張してある程度スクリプトっぽい
	動作も可能となりました。

	このファイルを扱うには、ある程度マップ作成についての知識が必要となります。

...	処理順序
	ファイルは、３つの基本セクション+αから構成され、以下の順序で処理されま
	す。

		precacheセクション
			↓
		randomspawnセクション
			↓
		entitiesセクション
			↓
		ラベル付entitiesセクション
			・
			・
			・

	precache、randomspawn、entitiesの３つは、初めてマップを読みこんだ際に処
	理されます。マップ間移動を行った場合に何回も呼ばれるという事はありません。
	(map xxxxx でマップ移動した場合、例外的に呼ばれる事があります)
	ラベル付entitiesセクションは、entitiesセクション上の簡易トリガから呼ばれ、
	処理されます。

...	ファイルの作成方法
	メモ帳などで記述します。
	ファイル名は"マップ名.txt"とし、mapaddフォルダに保存して下さい。

...	文字コード
	基本は、ASCII、CR+LFです。
	日本語を利用する場合は、UTF-8にコード変換する必要があります。
	このファイル内で、ローカライズリソース(各言語のメッセージを#HL_xxxのよう
	な識別文字に置き換えたもの)は利用出来ません。

...	例外処理
	中間コードへの変換をせずに、ゲーム中にテキスト解析を行うため、一部を除い
	て殆どの例外処理を省いています。
	よって、囲み忘れや、想定外の指定などがあった場合、エラー等が出力されない
	まま、ゲームエンジンが停止することがあります。

...	今の所実現できないもの

....		NPCのテンプレート化
		ドロップシップのカーゴからNPCを下ろす事が出来ません。
		
....		トリガ入出力の指定
		まだよく理解してないので。かわりに簡易トリガを用意しています。

....		状態の取得、変数の利用
		面倒なので。そこまでするとなんか自分でマップ作った方が早い気がす
		るので。

...	既知の問題、現象、制限事項

....		"entities"セクションで、"player"指定が動作しない。
		マップが読みこまれてすぐの時点では、プレイヤーがマップ上に出現
		していないため、動作しない模様。
		簡易トリガのタイマーを短い間隔にして処理させることで対応できます。

....		簡易トリガの処理間隔
		簡易トリガは、2秒おきに自分の周辺を確認しプレイヤーやエンティテ
		ィーが存在するかを確認します。
		半径に余裕を持たせない場合、素通りして処理されない場合があります。
		グループ指定を使って複数置くか、半径を大きくとる必要があります。

....		利用できるエンティティー
		大邸のエンティティーは配置できますが、マップロード後の配置という
		処理順序の問題から、うまく動作しないものも存在します。


..マップ設定ファイルの詳細説明
	マップ設定ファイルの、各セクションについて説明します。

...	"precache" セクション
	HalfLife2でエンティティーを出現させる際、読込みによる遅延を無くすため、
	予めモデル情報等を読みこんでおく必要があります。
	これをプリキャッシュといいます。
	このセクションに、マップ上に配置するエンティティーやモデルを記述しておく
	ことで、元々マップ上に配置されていないエンティティーをプリキャッシュする
	ことができます。

....		"entity" エンティティーキャッシュ
		エンティティー名を指定する事で、関連するモデル情報等をキャッシュ
		します。
		例:	市民をキャッシュ
			"entity"	"npc_citizen"

....		"model" モデルキャッシュ
		モデル名を指定する事で、指定されたモデルをキャッシュします。
		例:	エリートコンバインのモデルをキャッシュ
			"model"		"models/combine_super_soldier.mdl"

....		"sound" サウンドキャッシュ
		サウンド名を指定することで、指定されたサウンドをキャッシュします。
		キャプションつき音声の場合は、この指定であらかじめキャッシュして
		おかないと再生されません。

...	"randomspawn" セクション
	AIが移動するための基準となるAIノードというものがMAPには存在します。
	このセクションで、ノードの位置情報を利用し、ランダムにNPCなどを出現させ
	る事ができます。
	ノードは、エアノードと地面ノードを位置情報として利用します。また、プレイヤーの出
	現位置から一定範囲に存在するノード情報は無条件で無視します。
	
	一度利用したノードは再利用しません。よって、ノードが重なっていない限り、
	出現させたNPCが重なることがありません。
	配置時に利用できるノードがなくなった場合、その時点で配置を終了します。

....		"<Entity Name>" 指定エンティティーの出現
		<Entity Name>に出現させたいエンティティーを指定する事で、AIノー
		ドの位置にランダムに配置します。

		例:	ガッポイを5人ピストル&マンハック一基装備で配置
			"npc_metropolice" {
				"count"		"5"
				"weapon"	"weapon_pistol"
				"values"	"manhacks 1"
			}

.....			"count" 出現数
			ランダムに配置する数を指定します。
			例:	3人配置
				"count"		"3"

.....			"weapon" 持っている武器
			NPCの持つ武器を指定します。
			例:	ピストルを持たせる
				"weapon"		"weapon_pistol"
				
.....			"grenade" グレネード数
			コンバインの持つグレネード数を指定します。
			例:	グレネードを2つ所持
				"grenade"	"2"
			
.....			"model" モデル名
			エンティティーのモデルを指定します。
			prop_physicsに対するモデルの指定や、エリートコンバインの
			モデル指定に利用します。
			例:	gmanモデルを指定する
				"model"		"models/gman.mdl"

.....			"targetname" エンティティーにつける名前
			出現させるエンティティーに名前を付けます。
			例:	エンティティーに「gappoi01」と名前指定
				"targetname"	"gappoi01"

.....			"patrol" 見回りを開始する
			見回りが可能なNPCの場合、見回りを開始します。
			例:	見回りさせる
				"patrol"

.....			"patrolrandom" 見回りをランダムに開始します
			機能は"patrol"と同じですが、するかしないかはランダムで決
			まります。同じNPCがするとは限りません。
			例:	適当に見回りさせる
				"patrolrandom"

....			"stabilize" 物体を安定させる
			タレットなど不安定な物体を安定させます。
			指定する数値は、安定する限界角度です
			例:	45度まで耐える
				"stabilize"	"45"
			

.....			"values" その他の値の設定
			上記以外の情報をエンティティーに与えます。
			これは、マップエディタのKeyValueと同じで、２つをひと組と
			して、空白区切りで指定します。
			例: 市民種類を3にし、名前を付ける
				"values"	"citizentype 3 targetname cit1"

....		"removenodes" 出現基準ノードの削除
		指定した位置のノードを出現位置基準として利用しなくします。
		これは、敵が出現しては困るような場所に指定する事で問題を回避する
		ための物です。

.....			"origin" 削除基準位置
			ここで指定した位置を基準にノードを無視します。
			例:	
				"origin"	"134 -7354 -128"

.....			"radius" 削除半径
			指定した半径のノードを無視します。
			例:
				"radius"	"500"

....		"removeairnodes" エアノード削除
		変な場所に敵が出現してしまう場合は、大抵エアノードが関係しています。
		エアノードを削除する場合これを利用します
		
			例:
				"removeairnodes" {
				}
				
				※ 中に書くオプションは無いのですが、括弧は必須となっています。


...	"entities" セクション
	このセクションでは、エンティティーの配置をします。
	簡易的なトリガによる分岐、配置、撤去などが可能です。

....		"<Entity Name>" エンティティーの出現
		<Entity Name>に指定したエンティティーを出現させる事が出来ます。

		例:	コンバインにグレネードとマシンガンを持たせて配置
			"npc_combine_s" {
				"origin"	"809 2630 -58"
				"angle"		"0 90 0"
				"keyvalues" {
					"additionalequipment"	"weapon_smg1"
					"grenades"	"2"
				}
			}

.....			"origin" 出現位置
			出現位置を指定します。
			例:
				"origin"	"300 -500 20"

.....			"angle" 出現方向
			出現方向を指定します。
			※ x軸、y軸に数値を入れると、傾いて出てきます
			例:
				"angle"		"0 20 0"

.....			"velocity" 移動量
			物を投げたりしたい場合に指定します。
			ラグドール等も投げる事が出来ます。
			例:	上に放り投げる
				"velocity"	"0 0 100"

.....			"longrange" 長距離攻撃
			長距離攻撃を有効にし、策敵能力を引き上げる事ができます。
			例:
				"longrange"

.....			"freeze" 固定
			prop_physics等のフィジクスモデルの位置を固定したい場合に
			利用します。
			※ 固定を途中から解除する機能は、未実装です。
			例:
				"freeze"

.....			"alwaysthink" 強制動作
			プレイヤーから見えていない場所でも、NPCを動作させたい場
			合に指定します。
			例:
				"alwaysthink"

.....			"relation" リレーション設定
			NPCの好き嫌いを指定します。
			リレーション設定については、参考資料 - リレーション設定
			を参照して下さい
			
			例:	エイリアン大好き
				"relation"	"ll1"

....			"stabilize" 物体を安定させる
			タレットなど不安定な物体を安定させます。
			指定する数値は、安定する限界角度です
			例:	45度まで耐える
				"stabilize"	"45"
			

.....			"keyvalues" その他数値設定
			マップエディタなどで指定する、KeyValuesを指定します。
			武器の指定や、出現フラグ等はここで指定します。

....		"relation" リレーション設定の適用
		既にマップ上に配置されているNPCに対して、強制的にリレーション設
		定を適用する事が出来ます。

.....			"origin" 適用位置の設定
			適用する中心位置を指定します。

.....			"radius" 適用範囲の設定
			適用する半径を指定します。
			指定しない場合、マップ全域が適用範囲となります。
			※ radiusは、originとセットで使用する必要があります。

.....			"targetname" 適用するNPC名
			適用するNPC名を指定します。
			ワイルドカード指定が可能です。
			例:	combine-0 と combine-1 に適用
				"targetname"	"combine-*"

.....			"classname" 適用するエンティティー名
			適用するエンティティー名を指定します。
			既に配置されていたり、名前がふられていないNPCに対して適
			応したい場合に利用します。

			例:	ヘッドクラブに適用
				"classname"	"npc_headcrab"

.....			"relation" リレーション設定
			NPCの好き嫌いを指定します。
			リレーション設定については、参考資料 - リレーション設定
			を参照して下さい

....		"player" プレイヤーに対する設定
		プレイヤーに対する設定を行う事が出来ます。
		例えば、ある地点に瞬間移動させたり、メッセージの表示等が可能です。

.....			"origin" 位置設定
			プレイヤーの移動位置を指定します。
			デスマッチマップのシングル化などで、スタート位置を変更し
			たい場合などに利用します。

.....			"angle" 方向設定
			プレイヤーの向きを指定します。
			originでの移動と合わせて利用します。
			指定は3軸指定ですが、Y軸(2番目の値)のみ適用されます。

.....			"fadein" フェードイン
			黒い画面からフェードインさせます。
			シングル化の始め等に利用します。
			例:	5秒かけてフェードイン
				"fadein"	"5"

.....			"fadeout" フェードアウト
			画面を黒い画面にフェードアウトさせます。
			現在の仕様上、フェードアウトした状態を維持出来ないため、
			効果的な利用方法があんまりありません。
			例:	7秒かけてフェードアウト
				"fadeout"	"7"

.....			"message" メッセージ表示
			画面中央にメッセージを表示します。
			日本語を利用したい場合、テキストファイルがUTF-8でなけれ
			ばなりません。
			表示時間は約5秒で調整はできません。
			例:	おはよう博士と表示
				"message"	"Good morning Dr.Freeman."

.....			"kill" 強制自殺
			プレイヤーにkillコマンドを強制発行して自殺させます。
			ゲームオーバー代わりにどうぞ。
			例:	殺す
				"kill"

.....			"music" 音楽再生
			音楽を再生します。
			現在の音楽再生状態を把握しないので、場合によってはダブっ
			て再生されます。
			指定する音楽名は、level_sounds_music.txtにあります。
			例:	ノリの良い奴をひとつ
				"music"		"song14"

....		"removeentity" エンティティーの削除
		指定したエンティティーを削除します。
		海岸マップでthumperを消して、ゲームを難しくしたり色々出来ます。
		ただし、ブラシなどマップ構造に関連するものは削除出来ません。

.....			"origin" 削除位置の設定
			削除する中心位置を指定します。

.....			"radius" 削除範囲の設定
			削除する半径を指定します。
			指定しない場合、マップ全域が削除範囲となります。
			※ radiusは、originとセットで使用する必要があります。

.....			"targetname" 削除するNPC名
			削除するNPC名を指定します。
			ワイルドカード指定が可能です。
			例:	apcを削除
				"targetname"	"apc"

.....			"classname" 削除するエンティティー名
			削除するエンティティー名を指定します。

			例:	アイテム全部けす
				"classname"	"item_*"

....		"event" イベントの強制発生
		エンティティーに対してイベントを発生させます。
		イベントはトリガで発生するものと殆ど同じです。

.....			"targetname" イベントを発生対象の名前
			イベントを発生させたいNPCなどについている名前を指定しま
			す。
			ワイルドカード指定が可能です。

.....			"action" イベントの内容
			イベントの内容を指定します。
			具体的な内容はコンソールコマンドのent_fireで確認できます。
			
			例:	指定のパスに移動
				"action"	"gotopathcorner"

.....			"value" イベントに渡す数値
			イベント発生時に、エンティティーに渡す引数を指定します。
			
			例:	APCのスピードを300に設定
				"action"	"setdriversmaxspeed"
				"value"		"300"

.....			"delaytime" イベントの発生遅延
			イベントが発生するまでの遅延時間を指定します。
			
			例:	2秒後に火をつける
				"action"	"ignite"
				"delaytime"	"2.0"

....		"sound" サウンドの再生
		指定のサウンドを再生します。
		ターゲットを指定することで、キャプションつき会話をさせることも
		できます。
		いまのところ、ボリューム設定とかはありません。
		
.....			"targetname" サウンドを再生させる対象の名前
			サウンドを再生させたいキャラクターを指定します。
			同名のキャラクターがいた場合は、最初に検索したエンティ
			ティーのみ再生対象となります。

.....			"origin" 再生位置の指定
			音を再生する位置を決めます。
			targetnameが指定されていた場合、そちらが優先されます。

.....			"soundname" 再生する音声名
			再生するサウンド名を指定します。

....		"lua" lua言語関数呼び出し
		.luaファイル内の関数を呼び出します。

.....			"callfunc" 関数名の指定
			実行する関数名を指定します。

....		"instant_trig" 簡易トリガエンティティー
		これは、マップ設定ファイル用に作成された簡易的なトリガです。
		これを使う事で、ラベル付Entitiesセクションを処理する事ができます。
		実際に配置できるエンティティーですので、マップエディタ上でも利用
		できますが、オススメしません(というか意味がありません)。
		位置以外の情報は、keyvaluesとして指定する必要があります。
		このエンティティーは、ラベル先処理時に自分自身を破棄します。

.....			"origin" トリガ位置の指定
			トリガの位置を指定します。
			これはトリガ半径の中心位置となります。

.....			"radius" トリガ半径
			トリガの半径(大きさ)を指定します。
			この内側にエンティティーが入った時、ラベル先が処理されま
			す。
			originの指定が必須となります。

.....			"label" 処理先ラベル
			条件が揃った場合に、指定したラベルを処理します。
			ラベルは「:」で区切る事で複数指定可能で、ラベルをランダ
			ムで選択し、処理します。
			
			例:	go1かgo2を処理
				"label"		"go1:go2"

.....			"timer" タイマ
			指定した時間経過した時にラベル先を処理します。
			この指定とoriginなどの接触による判定は同時に利用できませ
			ん。
			指定は秒単位で、ミリ秒は小数で表します。
			例:	1.5秒後に処理
				"timer"		"1.5"

.....			"touchname" 接触エンティティー名
			origin radiusで指定した範囲に指定した名前のエンティテ
			ィーが入ってきたら、ラベル先を処理します。
			プレイヤー以外を対象としたい場合に利用します。
			たとえば、「脱出ポイントに博士を連れてきた」などの場合に
			利用します。

			例:	ガッポイが来た
				"touchname"	"gappoi"

.....			"islived" 死んでるかの確認
			指定した名前のエンティティーが生きているかを確認します。
			指定したエンティティーがなくなっていた場合にラベル先を処
			理します。Healthの確認はしないため、エンティティーが存在
			すれば体力がマイナスであろうと生きてると判定します。
			
			例:	スイカがあるか？
				"islived"	"watermelon"

.....			"group" トリガグループの指定
			トリガにグループ番号を付けて管理します。
			グループ番号は、トリガの削除に関連します。
			指定しない場合、0を指定されます。
			
			例:	グループ番号1に指定
				"group"		"1"

.....			"removegroup" トリガグループの削除
			ラベル先処理時に、自分が属しているグループのトリガを全て
			削除します。
			例:	やる
				"removegroup"	"1"

.....			"noclear" トリガ削除をしない
			ラベル先処理時に、トリガを削除しません。
			一定期間で毎回処理したい場合などに利用します。
			このトリガを削除したい場合は、グループに属すよう指定し、
			他のトリガからremovegroupを利用して削除します。
			
			例:	消さない
				"noclear"	"1"

.....			"OnHitTrigger"アウトプット
			トリガーが実行される際、指定のイベントを処理できます。

...	ラベル付 "entities" セクション
	簡易トリガから処理させる為のセクションです。内容的にはentitiesセクション
	と同じものです。
	ラベルは「:」の後に続けて書きます。
	
	例：	簡易トリガから処理させるgappoiラベル
	
		"entities" {
			"instant_trig" {
				"label"		"gappoi"
			}
		}

		"entities:gappo" {
			・
			・
			・
		}

..参考資料
...	マップ設定ファイル作成に便利なコマンドとか

....		developer 1
		開発者向け情報を出力します。
		トリガが処理された場合、「Hit Trigger : trig1」などのメッセージ
		が表示されます。

....		show_activenodes 1
		randomspawnで利用するノード位置を表示します。
		ただし、マップ設定ファイル上に"randomspawn"セクションが記述され
		てなければなりません。
		notargetをonにしていると表示されない場合があったようななかったよ
		うな

....		impulse 90
		プレイヤーの現在位置と方向のPlayer Position、クロスへアー先の位
		置と、接触面の向きを表したTrace Positionをコンソールに出力します。
		getposとは違い、足もとを基準にしている事に注意して下さい。
		Trace Positionは、ヘルスチャージャーや、バーナクル等を配置するの
		に有効です。
		smod29から、Eye Positionも出力するようになりました。
		これは、プレイヤーの目の位置座標です。

....		物ランチャーの吸う方
		物ランチャーで吸うと、コンソールに吸ったエンティティーの情報が、
		マップ設定ファイルで利用出来る形で出力されます。
		prop_physicsをE3銃で配置して、物ランチャーで吸うと配置が楽だった
		りします。

....		ai_nodes と ai_show_connect
		ノードの位置が確認できます。

...	リレーション設定
	リレーション設定は、NPCの振る舞い方を決定する要素の一つで、他のNPCと友好
	的かどうか等を設定します。
	設定は、３文字を１つとして空白区切りで記述します。
	３文字の内容は以下の通りです。
		┌───┬───────────────┬──────────┐
		│ 位置 │説明                          │備考                │
		├───┼───────────────┼──────────┤
		│  １  │設定対象となるNPCの種類       │今のところ区分けが適│
		│      │a ... アントライオン          │当です。            │
		│      │g ... ゴードン(プレイヤー)    │将来的に詳細設定出来│
		│      │v ... ボーティガント          │るようにするかもしれ│
		│      │p ... 市民やバーニー等        │ません。            │
		│      │c ... コンバイン関連          │                    │
		│      │s ... ストーカー              │                    │
		│      │l ... エイリアン等            │                    │
		├───┼───────────────┼──────────┤
		│  ２  │NPC対する属性                 │f にすると大邸攻撃せ│
		│      │h ... 敵対   l ...友好        │ずに逃げます。      │
		│      │f ... 恐怖   n ...中立        │                    │
		├───┼───────────────┼──────────┤
		│  ３  │処理優先度を数字で指定        │大邸「1」でOK.      │
		└───┴───────────────┴──────────┘

	例: バーニーは、ストーカーを気にしないで、コンバインが大好き、
	　　ボーティガントが怖い
	"npc_barney" {
		"relation"	"sn1 cl5 vf1"
	}

...	簡易トリガ
....		トリガを使った例
		ゴードンが、ある位置にきたらガッポイが上からロープで降りて来る
		
		"entities" {
			"npc_metropolice" {
				"origin" "100 103 78" "angle" "0 -145 0"
				"keyvalues" {
					"targetname"		"gappoi1"
					"waitingtorappel"	"1"
					"spawnflags"		"33685508"
				}
			}
			"instant_trig" {
				"origin" "0 0 20"
				"keyvalues" {
					"label"		"rap"
					"radius"	"100"
				}
			}
		}

		"entities:rap" {
			"event" {
				"targetname"	"gappoi1"
				"action"	"BeginRappel"
				"value"		"1"
			}
		}

....		グループの使い方
		グループは、トリガの削除を制御するためのもので、利用する状況とし
		以下のものが考えられます。

			・２以上のトリガの何れかを１度だけ処理
			
				"instant_trig" {
					"origin" "300 100 -40"
					"keyvalues" {
						"label"		"lb1"
						"radius"	"50"
						"group"		"1"
						"removegroup"	"1"
					}
				}

				"instant_trig" {
					"origin" "300 150 -40"
					"keyvalues" {
						"label"		"lb2"
						"radius"	"50"
						"group"		"1"
						"removegroup"	"1"
					}
				}
				
				lb1が処理されたら、lb2のためのトリガは削除され、
				lb2は処理されないようになります。
			
			・削除されないトリガを他のトリガで削除
		
				"instant_trig" {
					"keyvalues" {
						"label"		"drop1"
						"timer"		"5"
						"noclear"	"1"
						"group"		"1"
					}
				}
				
				"instant_trig" {
					"keyvalues" {
						"timer"		"20"
						"group"		"1"
						"removegroup"	"1"
					}
				}

				5秒毎にdrop1を処理、20秒後にトリガを削除しdrop1
				が処理されないようにする。

...	たぶん良く使うkeyvalues

	"weapondrawn" "1"	// 武器を予め構えておく(市民保安軍のピストル用?)
	"manhacks" "1"		// 市民保安軍の所持するマンハックの数
	"additionalequipment" "weapon_pistol"	// 所持武器
	"NumGrenades" "0"		// グレネードの数

