--[TAB=4]----------------------------------------------------------------------
	NovelGame Chart Editor Ver.0.17
-------------------------------------------------------------------------------

○概要

	これは、アドベンチャー/ノベルゲームの作成に必要となる、フラグや選択肢による
	ゲーム進行(ゲームチャート)の分岐を、吉里吉里2/KAG3上で動作可能なデータとして作成
	作成するためのツール及びそのデータを実行するプラグインです。
	単純なフラグ処理、フラグによる分岐、選択肢の表示が可能で、既に再生済みのシナ
	リオを一覧する機能や、ゲームの進行をテストするための機能を持っています。


○ゲームチャート構成

	ゲームチャートは、一つの chart で構成されています。chart は複数の page で
	構成されており、page は複数の block と block を繋ぐ route によって構成され
	ています。図にすると、下記のようになります。

		chart ┬ page ┬ block ─ route
		      │      ├ block ┬ route
		      ：      ：       └ route
		      │
		      ├ page ┬ block ┬ route
		      │      │       ├ route
		      │      ：       └ route
		      ：

	基本的に、一つの chart で一つのゲームを管理することが出来ます。ゲーム中の
	１日等を一つの page に当てはめると管理しやすいでしょう。block は一つのシーン
	と考えると良いと思いますが、特にこだわる必要は無いと思います。


・用語：分岐

	分岐は、その時点で存在するフラグの状態によって、ゲームの進行を変化させる
	ための機能です。例えば、

		block.1 ┬(flagA が 1 のとき)→ block.2
		        ├(flagA が 2 のとき)→ block.3
		        └─────────-→ block.4

	のように、flagA の状態(入っている値)によって、次に進む block が変化します。


・用語：選択肢

	短い文章を画面に表示し、今後の行動についてプレイヤーに選択してもらうものが
	選択肢です。分岐と同じように次に進む block を変化させるのが目的ですが、そこ
	にはプレイヤーの意思が介在してきます。

		block.1 ┬「学校へ向かう」→ block.2
		        ├「街に出かける」→ block.3
		        └「外には出ない」→ block.4

	それぞれ、プレイヤーが次の行動としてどれを選択したかによって、次の block が
	変化します。

	なお、分岐と選択肢を組み合わせる事も可能です。分岐によって選択できる文章を
	変化させるというものです。

		block.1 ┬(日 が 平日 のとき)「学校へ向かう」→ block.2
		        ├(日 が 休日 のとき)「街に出かける」→ block.3
		        └─────────-「外には出ない」→ block.4

	上記のようにすると、休日は学校へ、平日は街へと出かける選択肢が表示されなく
	なります。条件を満たしていると出現する選択肢、なども作成可能ですが、分岐が
	優先されるため、一つでも条件の成立した分岐がある場合は、選択肢は表示されない
	ので注意してください。


・用語：マップ

	文章を表示して選んでもらうのが選択肢でしたが、画像を表示して、画像の中から
	プレイヤーに選択してもらうものを、マップと呼びます。文章では表現できない
	かったり、文章ではせいぜい３〜４項目から選択するのがやっと(これ以上はわかり
	づらくなる)なのですが、画像にすることで表現が多様で、わかりやすく選択して
	もらえるようになります。


・用語：フラグ

	フラグは、ゲームの進行状態を記録するための機能です。プレイヤーが選んだ行動に
	よってフラグが変化し、直後ではなく、未来の行動や状況に影響を与えるという
	仕組みを持たせることが出来ます。
	フラグは通常、KAGで言うところのゲーム変数(f)に記録されます。このためフラグの
	名前は、変数と同様の制限を受けます(KAG System リファレンス - チュートリアル
	- 変数を使おうを参照のこと)。

	フラグは、ゲームチャートを最初から開始したときにクリアされます。つまり、
	現在の進行状況を白紙に戻してから、新しいゲームを開始するようになっています。
	通常はこれで問題ない(こうなっていないと、想定していないフラグの状態が発生
	してしまいます)のですが、あるキャラクターを攻略した際のクリアフラグ等は、
	新しいゲームを開始したとしても残しておきたい場合があります。この場合はシス
	テムフラグを使ってください。

	システムフラグはKAGのシステム変数(sf)に記録されます。ですので常に記録され、
	消去されることはありません。システムフラグを利用したい場合は、名前の先頭に
	"_"(アンダーバー)をつけてください。

	例)
		A	: フラグ(ゲーム変数へ記録)
		_A	: システムフラグ(システム変数へ記録)

	なお、システムフラグの名前には"_"が付きますが、システム変数へ記録される場合
	には"_"は付きません。上記の例で言えば、どちらも"A"という名前です。

	例)
		A	: f.A  でアクセス可能
		_A	: sf.A でアクセス可能

	※ アドバイス
		フラグ名を簡便な日本語でつけておくと、後になってもわかりやすいと思います。
		一つのフラグを複数の用途に使いまわすのは、やめておきましょう。


・category 

	一度見たシーンを再生するために、シーンを選択するメニューが必要になりますが、
	全てのシーンを一覧にしてしまうと閲覧性が低くなってしまうため、分類しておく
	必要があります。category はシーンを分類するための仕組みとなります。
	category は以下のような構造を持ちます。

		root ┬ 1日目 ┬ 学校 ┬ 午前 ─┬ block
		     │       │      │        └ block
		     │       │      ├ 午後 ── block
		     │       │      └ 放課後 ─ block
		     ：       ：

	まず始めに root というカテゴリがあり、その下に任意に category を追加できます。
	category を入れ子構造にすることで、分類をよりわかりやすくしています。
	category の下には、category のほかに block を追加できます。category による
	分類を潜って行き、block を選ぶと対応するシーンが再生できる、という構造です。
	なお、category と同じ階層に block を追加することも可能です。

		root ┬ 1日目 ┬ 学校 ┬ 午前 ─ block
		     │       │      └ block


○ゲームチャート作成

	実行すると、3つのウィンドウが開きます。Chart Window, Main Console,
	Sub Console です。

	Chart Window にはゲームチャートが描画されます。block の配置や route の接続は
	このウィンドウで行います。
	Main Console では、現在作成している chart の大まかな情報と、ファイルの操作
	等が表示されています。
	Sub Console では、現在選択している block や route の情報が表示され、細かく
	設定できます。

	・Chart Window

		キー操作
			Ctrl+S
				チャートの保存
			Ctrl+X
				block の記憶
			Ctrl+V
				記憶 block の、別 page へのカット&ペースト

		何も無いところ
			・ダブルクリック
				block の追加
			・左ドラッグ
				+Spaceキー
					表示範囲の移動
				+Ctrlキー
					範囲選択(選択への追加)
				+Shiftキー
					範囲選択(選択からの削除)
				+なし
					範囲選択
				(範囲選択は、枠にかすった block, route を選択状態にする)
			・右ドラッグ
				

		選択状態
			・Delete キー押下
				選択している block, route 等の削除
			・選択状態の、何れかの block, route の移動
				選択しているものを全て移動

		block 上
			・左クリック
				block の選択
			・左ドラッグ
				block の移動
			・右クリック
				「block メニュー」の表示
			・block から block への右ドラッグ＆ドロップ
				最初の block から次の block へ route を繋ぐ
			・block から何もない場所への右ドラッグ＆ドロップ
				"ブロックを追加"メニューを表示
				(ドロップした位置へ、元の block から接続された block を追加する)

		block メニュー
			・ポップアップを表示
				block のあらすじが書かれた popup を表示
			・別ページへ繋ぐ
				別ページへの route を追加する
				(追加しただけでは「接続先: 未定」となる)
				(このときのオレンジ色を anchort と呼ぶ)
			・別ページから繋ぐ → 接続元の選択
				この block へ「別ページへ繋ぐ」を行った block を接続する
			・上下をそろえる(上端基準で/中心基準で/下端基準で)
			・左右をそろえる(左端基準で/中心基準で/右端基準で)
				選択されたオブジェクトの場所を、それぞれの基準で整列させる
			・スクリプトを実行する
				block にksファイルが設定されていれば、そのksファイルを実行させる
				(再生可能な環境が準備されているときのみ)
				(選択時にKAGシステムフォルダを指定する必要があります)

		route 上 (route を選択するには、接続元の■か接続先の矢印をクリック)
			・接続元、又は接続先の左クリック
				route の選択
			・接続元、又は接続先でない block へ左ドラッグ
				接続元、又は接続先の変更
				(■なら接続元、矢印なら接続先の変更)
			・ライン上での右クリック
				point の追加
				(point は任意に移動可能で、表示を見やすくするために移動させる)

		point 上
			・左クリック
				point の選択
			・左ドラッグ
				point の移動

		popup 上
			・左クリック
				popup を出しているものを選択
			・左ドラッグ
				popup の移動
			・右クリック
				縮小表示(再度右クリックすることで、縮小表示を解除)

		ahchor 上
			・左クリック
				anchor を選択
			・左ドラッグ
				anchor を移動
			・右クリック
				「anchor メニュー」の表示

		anchor メニュー
			・接続先のページを開く
				接続先となる block のある page へ移動する
			・接続元のページを開く
				接続元となる block のある page へ移動する
			・接続を切って、別のブロックに繋げられるようにする
				接続先の指定を解除する


	・Main Console

		縮尺	Chart Window の表示倍率を、10%刻みで10〜100% の間で変更できる
			拡大
				10% 表示を拡大する
			縮小
				10% 表示を縮小する
			文字の拡縮
				縮小して文字が見難くなった場合、解除することで文字を100%のままで
				表示する

		ファイル
			開く
				別のゲームチャートファイルを開く
			新規
				新しくゲームチャートを作成する
			保存
				現在編集中のファイルを保存する
			名前を付けて保存
				現在編集中のファイルを、別名で保存する

		印刷
			現在のページを印刷
				現在の page がすべて入るような形で、通常使うプリンタでフロー
				チャートを印刷する
			全てのページを印刷
				chart に含まれる全ての page を順番に印刷する

		ファイル名
				現在開いている chart のファイル名を表示します

		チャート名
				chart のタイトルを指定する
				(利用領域未定)

		ページ
			追加
				新しく page を追加する
			削除
				現在開いている page を削除する
			上へ
			下へ
				現在開いている page の順番を上下させる
				(見た目の問題だけで、ゲームの進行には影響を与えません)
			ページ名
				page のタイトルを指定する
					ゲーム進行中に、現在位置を表す際に使用されます
					例) 「1日目」
			ページ一覧
				page の一覧を表示します
				クリックして、現在の page を変更します

		開始ブロック
				ゲームを開始する page と block の名称が表示されます

		ブロック情報
			出力
				ブロックのID、タイトル、ksファイル名、あらすじをカンマまたは
				タブ区切りファイルとして出力します
			入力
				上記出力で出力したファイルを読み込み、反映します
			※	Excel/OpenOffice Calc等で編集してください
				IDは変更しないでください

		フラグ
			追加
				新しく flag を追加します
				ここで追加しておかないと、後で flag への処理や分岐の指定が行えません
			未使用フラグの整理
				値が加えられたり分岐の条件となっている flag を残して、使って
				いない flag を削除します
			フラグ一覧
				flag の一覧を表示します

		カテゴリー
			一覧
				category を表示するダイアログを開きます

	・Sub Console - block

		※ block を一つだけ選択しているときに、その block の詳細が表示されます

		ブロック名
				block のタイトルを指定する
					ゲーム進行中に使用されます
					(セーブ位置やスキップの確認等)
//		ID
//				block に割り当てられたIDを表示します

		ksファイル
				この block で再生されるksファイルを指定する
				参照ボタンでファイル選択ダイアログが表示されます
				※	ksファイルは自動検索パスに登録されているフォルダにある必要があります
					(scenarioフォルダの直下、又は Storages.addAutoPath メソッドでパスを追加)
					追加例)
						"data/scenario/script/"フォルダを自動検索パスに追加
						→	@eval exp="Storages.addAutoPath('scenario/script/')"

		処理
				この block を通過したときのフラグ処理を記述する
				設定ボタンで、簡単なフラグへの処理は設定できます
				例) 好感度に1を足す / 体力から2引く
				"詳細に"ボタンで、計算式をそのまま記述できるようになります
				例) 好感度+=1 / 体力-=2

		分岐タイプ
				次のブロックへ移動する場合の、分岐方法を選択します
			・分岐/選択肢
				条件によって route が変化する(異なる block へ移動)
				route に文章を設定することで、プレイヤーが任意に行先を選択できる
			・マップ
				背景にいくつかのボタンを置かれ、何れかのボタンをクリックすると
				関連付けられた route に沿って移動する

		※ 分岐タイプが「分岐/選択肢」の場合のみ表示
		ルート
			削除
				選択中の route を削除します
			詳細
				選択中の route の詳細を表示します
				(route を一つだけ選んでいる場合のみです)
			上へ
			下へ
				route 分岐の優先度を変化させます
				(上にあるものから分岐するかどうかチェックしていきます)
			ルート一覧
				この block に存在する route の一覧です


		※ 分岐タイプが「マップ」の場合のみ表示
		マップ背景
				マップの背景となる画像です
			参照
				ファイル選択ダイアログが開き、画像を指定できます

		method(trans タグを参照)
				マップを表示する場合のトランジション方法です

		rule(   〃   )
				method を universal にしたときのルール画像です
			参照
				ファイル選択ダイアログが開き、画像を指定できます

		time(   〃   )
				マップを表示する場合のトランジション時間です

		vague(   〃   )
				マップを表示する場合の vague 値です

		from(   〃   )
				mtehod を scroll にしたときに、裏画面の画像がどの方向から現れて
				くるかを指定します
		stay(   〃   )
				method を scroll にしたとき、画像が留まるかどうかを指定します

		ボタン
			配置
				ボタンを配置したり、背景画像を変更する「MapArrangeWindow」を開きます
			ボタン一覧
				配置されているボタンの一覧です
				一つのボタンが一つの route に対応しています
				また、表示されている座標は画像の中央の座標です


		Popup
			表示
				block に設定されているあらすじが書かれた popup をで Chart Window に
				表示します

		あらすじ
				この block のあらすじを記入します
				シーン再生メニューや、シーンスキップ時に表示されます

		開始ブロック
			開始ブロックにする
				この block をゲーム開始ブロックに設定します
				(既に開始ブロックになっている場合は「解除」となります)

		既読化ブロック
				この block を通過したときに、通過したものとする block を指定します
				例えば、ある block を通過すると flag が立ってしまい、別の block を
				通過できなくなる場合、ここで指定しておくとシーン再生メニューで見る
				ことができるようになります
			追加
				既読化ブロックを追加するダイアログを開きます
			削除
				選択している既読化ブロックを削除します
			既読化ブロック一覧
				この block と関連付けられている既読化ブロックの一覧を表示します

		既読時動作
				二度目にこの block へ来た時の動作を設定します
				特に指定が無ければ、ユーザー設定に従います
			強制スキップ
				この block に来ても、強制的にスキップされるようになります
			強制表示
				例え既読状態でも必ず再生されます

		カテゴリー
			追加
				この block を指定の category に追加するためのダイアログを開きます
			削除
				この block を一覧で選択されている category から取り除きます
			カテゴリー一覧
				この block が所属する category の一覧を表示します
				一つの block は、複数の category に所属することが可能です


	・Sub Console - route

		※ route を一つだけ選択しているときに詳細が表示されます

		分岐条件
				この route を通過する条件を設定します
				簡単なものであれば、設定ボタンから設定可能です
				例) 好感度が5より大きい / 体力が10以上
				指定がなければ自動的に分岐されます
				"詳細に"ボタンで、計算式をそのまま記述できるようになります
				例) 好感度>5 / 体力>=10

		※ route を持つ block の分岐タイプによって表示が変わります

		※ 分岐タイプが「分岐/選択肢」の場合のみ表示
		選択肢名
				選択肢として表示される場合の文章です
				分岐条件が満たされていなければ、選択肢も表示されません
				("\n"を文章の途中に入れると、その位置で改行されます)
				(AlternativePlugin.tjs の lineFeedString を変更すれば、別の記号を使用できます)

		※ 分岐タイプが「マップ」の場合のみ表示
		座標
				route に対応するボタンが配置されている座標を表示します
				この座標は、ボタンの中心の座標です
		画像名
				ボタンとして表示する画像のファイル名です
				(ボタン画像の詳細は別項にて)
			参照
				クリックするとファイル選択ダイアログが開きます

		ヒント
				ボタンにカーソルを合わせたときに表示したいテキストを指定できます

		移動元
		移動先
				この route の移動元・移動先となる block を表示しています

		Popup
			表示
				分岐条件であったり、選択肢名が書かれた popup が出現します


	・Map Arrange Window

		※ マップでのボタン配置をグラフィカルに行うため、専用のウィンドウが表示
		されます

		ファイルドロップ
				画像ファイルをウィンドウにドロップすると、その場所によって背景や
				ボタンに画像が読み込まれます
			ボタンの上にドロップ
				ボタンの上に画像ファイルをドロップすると、画像ファイルをその
				ボタンに読み込みます
			ボタン以外の場所にドロップ
				ボタン以外の場所にドロップすると、背景画像として読み込みます
				このとき操作ミスを防ぐため、背景画像とする前に確認ダイアログが
				表示されます

		ボタンの移動
				配置されているボタンをドラッグ＆ドロップすることで、ボタンの位置を
				変更することが出来ます


	※	「マップ」におけるボタン画像
	
		「マップ」で使用されるボタン画像は、button タグで使用される画像とは異なる
		規則で作成します。button タグであれば左から順番に
			「通常の状態」「ボタンが押された状態」「ボタン上にマウスカーソルがある状態」
		の3つですが、ここでは
			「通常の状態」「ボタン上にマウスカーソルがある状態」「ボタンが押された状態」「ボタンが無効な状態」
		の4つになります。
		button タグと同じ形式で画像を用意したい場合は、下記のファイルを開いて該当
		部分を変更することで対応可能です。

			PushButtonLayer.tjs
				@set(USE_KRKR_BUTTON=0) を @set(USE_KRKR_BUTTON=1) に

			MapArrangeWindow.tjs
				@set(USE_KRKR_BUTTON=0) を @set(USE_KRKR_BUTTON=1) に


○ゲームチャート実行

	ゲームチャートを実行する場合の手順は以下の通りとなります。

		@call storage=TracerPlugin.ks
		@settracerreturn storage=title.ks target=*title
		@startchart storage=gamechart.gc

	それぞれを説明すると、まず"@call storage=TracerPlugin.ks"でゲームチャートを
	実行するための KAGPlugin である"TracerPlugin.ks"を読み込みます。
	次に"@settracerreturn〜"で、ゲームチャートの終了後の移動先を指定しています。
	終了後というのは、ゲームチャートがそれ以上実行できなくなった場合、つまり、
	route を持たない block の処理が終了したり、route を持っていても条件が合わず
	次に進むことが出来なくなったときです。このとき"@settracerreturn〜"で指定され
	たksファイルへ移動します。
	最後に"@startchart"で実行するゲームチャートファイルを指定して、ゲームチャートの
	処理を開始します。


○テスト

	ゲームチャートの進行が意図通りになっているかテストする方法として、.ksファ
	イルを実行せずにksファイル名をメッセージウィンドウに表示するモードを用意
	しました。このモードでは、ksファイルの指定があるブロックに移動したとき、
	ksファイル名をメッセージウィンドウへ表示し、クリック待ち状態になります。
	クリックすると次のブロックへ分岐したり、選択肢が表示されます。
	このモードにする方法は次の2種です。
		TracerPlugin.ks の NoPlayScript を true にする
		TracerPlugin.ks を call タグで呼び出した後、debug_noplayscript タグを呼び出す

	また、登録されているフラグの状態を一覧することもできます。別ウィンドウを開き、
	フラグ名の一覧と現在の状態の表示するには、下記の手続きを行なってください。
		Shift + F4 でコンソールウィンドウを開く
		入力欄に dispFlagListWindow() と入力し、Enter を押す
	すでにチャートが読み込まれていれば、この手続きでウィンドウが表示されます。
	ウィンドウのサイズは自由に変更出来、表示されていないフラグはマウスホイールを
	スクロールさせることで閲覧できます。


○シナリオ再生メニュー

	既読、つまりプレイヤーが既に実行したことのあるksファイルの、リプレイメニュー
	(=シナリオ再生メニュー)を表示する場合の手順は以下の通りとなります。

	まず *start へ移動して、プラグインを読み込みます。次に、状態をリセットします。

		*start
		@eval exp="Scripts.execStorage('ScenarioPlayMenuPlugin.tjs')"
		@reset_scenarioplaymenu
		@store enabled=false

	次に、メニューを作成します。メッセージレイヤーが重ならないように消し、メニュー
	自体、カテゴリー一覧、シナリオ一覧の順で初期設定しています。そして画面をトラン
	ジションして、メニューを表示させています。

		*redisplay
		@position page=back layer=message visible=false
		@set_scenarioplaymenu bgimage=scenariomenu_bg next=*next already=true
		@set_scenarioplaymenu_categorylist left=29 top=58 width=173 height=398 bwidth=173 bheight=30 bfontheight=26 stepx=0 stepy=30 vert=true indent=22
		@set_scenarioplaymenu_scenariolist left=224 top=58 width=386 height=398 bwidth=386 bheight=30 bfontheight=26 stepx=0 stepy=30 vert=true
		@trans layer=base method=crossfade time=800
		@wt
		@position page=back layer=message visible=true
		@s

	ユーザーの操作が完了すると、指定していた *next へ移動します。ここで状態に
	合わせて分岐します。
	まず、特にシナリオを選択せずにメニューを閉じた場合は、

		*next
		@stoptrans
		@if_dont_choose_scenario target=*end

	一度トランジションして、呼ばれたところへ戻る事になります。

		*end
		@eval exp="with(kag.back.base){.fillRect(0,0,.width,.height,0xFF000000);}"
		@trans layer=base method=crossfade time=800
		@wt
		@store enabled=true
		@return

	もしメニューからシナリオを選んでいた場合は、こちらでも一度黒画面へトランジ
	ションして、

		@eval exp="with(kag.back.base){.fillRect(0,0,.width,.height,0xFF000000);}"
		@trans layer=base method=crossfade time=800
		@wt

	選択されたksファイルを呼び出します。再生が終了したら、呼び出された時と同様に
	黒画面に一度変更して、メニューを再表示します。

		@call storage=&scenarioplaymenu_object.scenario_script
		@eval exp="with(kag.back.base){.fillRect(0,0,.width,.height,0xFF000000);}"
		@trans layer=base method=crossfade time=800
		@wt
		@jump target=*redisplay

	大体の流れは以上です。トランジションのルールを変更したり、シナリオ呼び出し時の
	フェード画像を変更すれば、いくらかカスタマイズできるかと思います。
	実際に動作を確認したい場合は、sample を実行してみてください。


○ksファイルの準備

	block に設定するksファイルは call タグで呼び出されるため、スクリプトの最後に
	return タグを置いておく必要があります。また、ksファイル内にセーブ用のラベルを
	記載する場合、block に指定したブロック名を利用したいときは次のように記述して
	ください。

		*page34|			※ page34 というラベル名は仮のものです

	ブロック名は f.scripttitle という変数に記録されているため、それを利用する
	こともできます。例えば、

		@eval exp="f.tmptitle=f.scripttitle+' - 34ページ'"
		*page34|&f.tmptitle

	等できます。

