アマゾンバナーリンク

会話用スクリプトエンジン

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DxLibDLL;
using System.Windows.Forms;
using static ShootingGame.CInput;

namespace ShootingGame
{
	public class CScriptControl
	{
		const int BUFF_SIZE = 256;
		const int BOX_START_X = 0; // 文字を描画する黒いボックスのX座標
		const int BOX_START_Y = 310;// 文字を描画する黒いボックスのY座標
		const int STR_START_X = 30; // DispMessageのX座標
		const int STR_START_Y = 320; // DispMessageのY座標
		const int SELECT_STR_X = 340; // 選択肢の文字のX座標
		const int SELECT_STR_Y = 320; // 選択肢の文字のY座標
		const int SELECT_STR_DIST = 15; // 選択肢の文字の行間の距離
										// LoadGraph対応テーブル
		public class COneBmpTable
		{
			public int GraphHandle;
			public string Name;
		};
		// LoadDivGraph対応テーブル
		public class CPluralsBmpTable
		{
			public int[] GraphHandles;
			public int AllNum; // GraphHandlesの最大要素数
			public string Name;
		};
		//LoadGraphで1人のキャラのアニメーション(複数)
		public class CAnimationBmpTable
		{
			public int[] GraphHandles;
			public string Name;
		};
		//LoadGraph対応キャラクタプレーン
		public class COneCharaPlane
		{
			public string Name;
			public int X, Y;           // 座標
			public int GraphHandle;    // 画像データ
			public bool Flag;          // 切り替わりフラグ
			public float Alpha;            // アルファ値
		};
		//LoadDivGraph対応キャラクタプレーン
		public class CPluralsCharaPlane
		{
			public string Name;
			public int X, Y;           // 座標
			public int CharaNum;       // キャラ番号
			public int AllNum;         // GraphHandlesの最大要素数
			public int[] GraphHandles;  // 画像データ
			public bool Flag;          // 切り替わりフラグ
			public float Alpha;            // アルファ値
		};
		//LoadGraphで1人のキャラのアニメーション(複数)
		public class CAnimationCharaPlane
		{
			public string Name;
			public int X, Y;               // 座標
			public int CharaType;          // キャラのアニメーションの種類
			public int[] GraphHandles;   // 画像データ
			public bool Flag;              // 切り替わりフラグ
			public float Alpha;                // アルファ値
		};
		public class CSoundDataTable
		{
			public int SoundHandle;
			public int PlayType;
			public string Name;
		};

		public class CSelectTable
		{
			public List<string> SelectMessage = new List<string>();  // 選択肢のテキスト
			public string SelectJump;          // ジャンプ先
		}

		public class CFlag
		{
			public bool Flag;
			public string FlagName;
		}
		List<CFlag> Flag = new List<CFlag>();
		List<CSelectTable> SelectTable = new List<CSelectTable>();
		List<COneBmpTable> OneTexTable = new List<COneBmpTable>();
		List<CPluralsBmpTable> PluralsTexTable = new List<CPluralsBmpTable>();
		List<COneCharaPlane> OneCharaPlane = new List<COneCharaPlane>();
		List<CPluralsCharaPlane> PluralsCharaPlane = new List<CPluralsCharaPlane>();
		List<CAnimationBmpTable> AnimTexTable = new List<CAnimationBmpTable>();
		List<CAnimationCharaPlane> AnimCharaPlane = new List<CAnimationCharaPlane>();
		List<CSoundDataTable> SoundDataTable = new List<CSoundDataTable>();

		int BackBmp;
		int ReadX, ReadY;
		bool StopFlag, EnterFlag, PageChange, SelectFlag, DrawBoxFlag, EndFlag, SkipFlag;
		int TextSize, TextSpeed;
		uint FontColBuf;
		List<uint> FontColor = new List<uint>();
		string SelectMessage;
		int SelectPoint;
		List<string> ScriptBuff = new List<string>();
		List<string> DispMessage = new List<string>();
		public CScriptControl(string file_name)
		{
			StopFlag = EnterFlag = PageChange = SelectFlag = DrawBoxFlag = EndFlag = SkipFlag = false;
			TextSpeed = 3;
			SelectPoint = 0;
			FontColBuf = DX.GetColor(255, 255, 255);
			FontColor.Add(FontColBuf);
			ReadX = 0;
			ReadY = 0;
			ReadScript(file_name);
			DispMessage.Add(string.Empty);
			InitFlag();
		}
		void InitFlag()
		{
			Flag.Clear();
		}
		int Cnt = 0;
		bool ReadScript(string file_name)
		{
			int fh = DX.FileRead_open(file_name);
			if (fh == 0)
			{
				return false;
			}

			while (DX.FileRead_eof(fh) == 0)
			{
				// 1行読み込む
				StringBuilder sb = new StringBuilder(BUFF_SIZE);
				DX.FileRead_gets(sb, BUFF_SIZE, fh);
				if (string.IsNullOrWhiteSpace(sb.ToString())) continue;
				// 先頭文字が「//」ならスキップ
				if (sb.ToString().Substring(0, 2) == "//") continue;
				ScriptBuff.Add(sb.ToString());
			}

			DX.FileRead_close(fh);

			return true;
		}
		public bool MainEngne()
		{
			if (EndFlag) return false;
			if (StopFlag) return true;

			// エンター入力待ち、ページ切り替えなら
			if (EnterFlag || PageChange) return true;
			//選択肢決定待ち
			if (SelectFlag) return true;
			if (SkipFlag)
			{
				SkipFlag = false;
				while (true)
				{
					if (ScriptBuff[ReadY][0] == '#')
					{
						string res = CommandFunc();
						if (res == "true")
						{
							ReadY++;
						}
						else
						{
							MessageBox.Show($"{res}は定義されてないコマンドです");
							ScriptBuff.RemoveAt(ReadY);
						}
					}
					else
					{
						//テキスト表示部
						TextFunc();
					}

					if (ScriptBuff.Count <= ReadY)
					{
						break;
					}
					else if (ScriptBuff[ReadY] == "#page")
					{
						break;
					}
					else if (ScriptBuff[ReadY] == "#enter")
					{
						break;
					}
				}
			}
			else
			{
				if (++Cnt < TextSpeed)
				{
					return true;
				}
				Cnt = 0;
				if (ScriptBuff[ReadY][0] == '#')
				{
					string res = CommandFunc();
					if (res == "true")
					{
						ReadY++;
					}
					else
					{
						MessageBox.Show($"{res}は定義されてないコマンドです");
						ScriptBuff.RemoveAt(ReadY);
					}
				}
				else
				{
					//テキスト表示部
					TextFunc();
				}
			}
			return true;
		}
		string CommandFunc()
		{
			System.StringSplitOptions option = System.StringSplitOptions.RemoveEmptyEntries;
			string[] param = ScriptBuff[ReadY].Split(new char[] { ',', ' ' }, option);
			param[0] = param[0].Replace("#", "");

			COneBmpTable bmp_table_temp = new COneBmpTable();
			CPluralsBmpTable plurals_bmp_table = new CPluralsBmpTable();
			CAnimationBmpTable anim_table_temp = new CAnimationBmpTable();
			CSoundDataTable sound_data_table = new CSoundDataTable();

			// 次のページへ行く処理
			if (param[0] == "page")
			{
				PageChange = true;
			}
			// エンター待ち
			else if (param[0] == "enter")
			{
				EnterFlag = true;
			}
			// 背景画像
			else if (param[0] == "background")
			{
				for (int i = 0; i < OneTexTable.Count; i++)
				{
					if (param[1] == OneTexTable[i].Name)
					{
						BackBmp = OneTexTable[i].GraphHandle;
						break;
					}
				}
			}
			// キャラ画像読み込み
			else if (param[0] == "loadgraph")
			{
				// 識別用の名前
				bmp_table_temp.Name = param[1];
				// 画像の読み込み
				bmp_table_temp.GraphHandle = DX.LoadGraph(param[2]);
				OneTexTable.Add(bmp_table_temp);
			}
			// キャラ画像分割読み込み
			else if (param[0] == "loaddivgraph")
			{
				// 識別用の名前
				plurals_bmp_table.Name = param[1];
				// 画像の分割数
				plurals_bmp_table.AllNum = int.Parse(param[3]);
				// すべての画像数だけ配列を用意
				plurals_bmp_table.GraphHandles = new int[plurals_bmp_table.AllNum];
				// 画像の読み込み
				if (DX.LoadDivGraph(
					param[2], plurals_bmp_table.AllNum,
					int.Parse(param[4]),
					int.Parse(param[5]),
					int.Parse(param[6]),
					int.Parse(param[7]),
					plurals_bmp_table.GraphHandles) == -1) MessageBox.Show("画像ファイル読み込み失敗");

				PluralsTexTable.Add(plurals_bmp_table);
			}
			// アニメーション用キャラ画像読み込み
			else if (param[0] == "loadanimgraph")
			{
				// AnimTexTableにparam[1]と同じ名前があったらそこに追加
				// なかったら新しくAddする
				bool same = false;
				for (int i = 0; i < AnimTexTable.Count; i++)
				{
					if (AnimTexTable[i].Name == param[1])
					{

						int t = int.Parse(param[2]);
						AnimTexTable[i].GraphHandles[t] = DX.LoadGraph(param[3]);
						same = true;
						break;
					}
				}
				if (!same)
				{
					// 識別用の名前
					anim_table_temp.Name = param[1];
					// キャラアニメ番号
					int t = int.Parse(param[2]);
					// 画像の読み込み
					anim_table_temp.GraphHandles[t] = DX.LoadGraph(param[3]);
					AnimTexTable.Add(anim_table_temp);
				}
			}
			else if (param[0] == "loadsoundmem")
			{
				// 識別用の名前
				sound_data_table.Name = param[1];
				// サウンドデータの読み込み
				sound_data_table.SoundHandle = DX.LoadSoundMem(param[2]);
				// プレイタイプ
				sound_data_table.PlayType = int.Parse(param[3]);

				SoundDataTable.Add(sound_data_table);
			}
			else if (param[0] == "playsoundmem")
			{
				for (int i = 0; i < SoundDataTable.Count; i++)
				{
					if (param[1] == SoundDataTable[i].Name)
					{
						switch (SoundDataTable[i].PlayType)
						{
							case 0:
								DX.PlaySoundMem(SoundDataTable[i].SoundHandle, DX.DX_PLAYTYPE_NORMAL);
								break;
							case 1:
								DX.PlaySoundMem(SoundDataTable[i].SoundHandle, DX.DX_PLAYTYPE_BACK);
								break;
							case 2:
								DX.PlaySoundMem(SoundDataTable[i].SoundHandle, DX.DX_PLAYTYPE_LOOP);
								break;
							default:
								DX.PlaySoundMem(SoundDataTable[i].SoundHandle, DX.DX_PLAYTYPE_BACK);
								break;
						}
					}
				}
			}
			// キャラをセットする
			else if (param[0] == "chardisp")
			{
				CharaLoader();
			}
			// キャラをセットする
			else if (param[0] == "divchardisp")
			{
				DivCharaLoader();
			}
			// アニメ用キャラをセット
			else if (param[0] == "animchardisp")
			{
				AnimCharaLoader();
			}
			// キャラクリア
			else if (param[0] == "charclear")
			{
				CharaClear();
			}
			// キャラクリア
			else if (param[0] == "divcharclear")
			{
				DivCharaClear();
			}
			else if (param[0] == "animcharclear")
			{
				AnimCharaClear();
			}
			// テキスト用背景
			else if (param[0] == "drawbox")
			{
				DrawBoxFlag = !DrawBoxFlag;
			}
			// テキストスピード
			else if (param[0] == "textspeed")
			{
				TextSpeed = int.Parse(param[1]);
			}
			// テキストサイズ
			else if (param[0] == "textsize")
			{
				TextSize = int.Parse(param[1]);
			}
			// フォントカラー
			else if (param[0] == "setcolor")
			{
				FontColBuf = DX.GetColor(int.Parse(param[1]), int.Parse(param[2]), int.Parse(param[3]));
			}
			// キャラと文章とカーソルを初期化
			else if (param[0] == "sceneclear")
			{
				SceneClear(1);
			}
			// キャラと文章のみ初期化
			else if (param[0] == "strclear")
			{
				SceneClear(0);
			}
			// 選択文の実行
			else if (param[0] == "select")
			{
				SetCommando();
			}
			//ジャンプポインタまで移動
			else if (param[0] == "jump")
			{
				MoveJumpPoint(int.Parse(param[1]));
				PageChange = true;
			}
			// スクリプトジャンプ用ラベル
			// 通常通過時はスルー
			else if (param[0] == "label")
			{

			}
			// フラグオン
			else if (param[0] == "flagon")
			{
				CFlag flag = new CFlag();
				flag.Flag = true;
				flag.FlagName = param[1];
				Flag.Add(flag);
			}
			// フラグオフ
			else if (param[0] == "flagoff")
			{
				CFlag flag = new CFlag();
				flag.Flag = false;
				flag.FlagName = param[1];
				Flag.Add(flag);
			}
			// フラグチェック
			else if (param[0] == "flagcheck")
			{
				for (int i = 0; i < Flag.Count; ++i)
				{
					if (param[1] == Flag[i].FlagName)
					{
						if (Flag[i].Flag)
						{
							MoveJumpPoint(int.Parse(param[2]));
							PageChange = true;
						}
						else
						{
							MoveJumpPoint(int.Parse(param[3]));
							PageChange = true;
						}
					}
				}
			}
			else if (param[0] == "end")
			{
				EndFlag = true;
			}
			// 汎用パラメーター操作
			// 1が操作したいパラメーターの要素番号
			// 2が+だとカウントアップ-だとカウントダウン
			else if (param[0] == "paramoperation")
			{
				//if( param[2][0] == '+' )
				//	Game->Param[ GetNumberValue<int>( param[1] ) ]++;
				//if( param[2][0]== '-' )
				//	Game->Param[ GetNumberValue<int>( param[1] ) ]--;
			}
			else // 定義されてないコマンドの場合param[0]を返す
			{
				return param[0];
			}
			return "true";
		}

		void TextFunc()
		{
			int size = DispMessage.Count - 1;

			if (ScriptBuff.Count <= ReadY)
			{
				MessageBox.Show("ReadYがScriptBuffのサイズを越えています");
				DX.DxLib_End();
			}

			DispMessage[size] = ScriptBuff[ReadY].Substring(0, ReadX);

			FontColor[size] = FontColBuf;

			//改行チェック
			if (ScriptBuff[ReadY].Length <= ReadX)
			{
				DispMessage.Add(string.Empty);
				FontColor.Add(0);
				ReadY++;
				ReadX = 0;
			}
			//終了チェック
			if (ScriptBuff.Count <= ReadY)
			{
				StopFlag = true;
				return;
			}
			// 2バイト文字なら2進める1バイト文字なら1進める
			ReadX += IsLeadByte(ScriptBuff[ReadY][ReadX]) ? 2 : 1;
		}
		// cが2バイト文字の1文字目ならば真を返す
		bool IsLeadByte(char c)
		{
			return (0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc);
		}
		void CharaLoader()
		{
			System.StringSplitOptions option = System.StringSplitOptions.RemoveEmptyEntries;
			string[] param = ScriptBuff[ReadY].Split(new char[] { ',', ' ' }, option);
			for (int i = 0; i < OneTexTable.Count; i++)
			{
				if (param[1] == OneTexTable[i].Name)
				{
					int x = int.Parse(param[2]);
					int y = int.Parse(param[3]);

					// 同じ名前で同じ座標の物があったら追加しない
					for (int j = 0; j < OneCharaPlane.Count; j++)
					{
						if (OneCharaPlane[j].Name == OneTexTable[i].Name)
						{
							if (OneCharaPlane[j].X == x && OneCharaPlane[j].Y == y)
							{
								return;
							}
						}
					}
					COneCharaPlane t = new COneCharaPlane();
					t.Name = OneTexTable[i].Name;
					t.GraphHandle = OneTexTable[i].GraphHandle;
					t.Alpha = 255f; // ここを0にすればフェードインするようになる
					t.Flag = true;
					t.X = x;
					t.Y = y;
					OneCharaPlane.Add(t);
					break;
				}
			}
		}
		void DivCharaLoader()
		{
			System.StringSplitOptions option = System.StringSplitOptions.RemoveEmptyEntries;
			string[] param = ScriptBuff[ReadY].Split(new char[] { ',', ' ' }, option);
			for (int i = 0; i < PluralsTexTable.Count; i++)
			{
				if (param[1] == PluralsTexTable[i].Name)
				{
					int x = int.Parse(param[2]);
					int y = int.Parse(param[3]);
					int chara_num = int.Parse(param[4]);// 使用する画像ナンバー

					CPluralsCharaPlane t = new CPluralsCharaPlane();
					t.Name = PluralsTexTable[i].Name;
					t.GraphHandles = new int[PluralsTexTable[i].AllNum];

					for (int j = 0; j < PluralsTexTable[i].AllNum; j++)
					{
						t.GraphHandles[j] = PluralsTexTable[i].GraphHandles[j];
					}

					t.Alpha = 255.0f; // ここを0にすればフェードインするようになる
					t.Flag = true;
					t.X = x;
					t.Y = y;
					if (chara_num > PluralsTexTable[i].AllNum - 1)
					{
						MessageBox.Show("画像ナンバーが規定値を越えました");
						//char_num = PluralsTexTable[i].AllNum-1;
					}
					t.CharaNum = chara_num;
					PluralsCharaPlane.Add(t);
					break;
				}
			}
		}
		void AnimCharaLoader()
		{
			System.StringSplitOptions option = System.StringSplitOptions.RemoveEmptyEntries;
			string[] param = ScriptBuff[ReadY].Split(new char[] { ',', ' ' }, option);

			// もし同じ名前があったらt.CharaTypeや座標を変更するだけ
			// なかったらAnimCharaPlane.Add
			bool same = false;
			for (int i = 0; i < AnimCharaPlane.Count; i++)
			{
				if (AnimCharaPlane[i].Name == param[1])
				{
					AnimCharaPlane[i].CharaType = int.Parse(param[2]);
					int x = int.Parse(param[3]);
					int y = int.Parse(param[4]);
					AnimCharaPlane[i].X = x;
					AnimCharaPlane[i].Y = y;
					same = true;
					break;
				}
			}
			if (!same)
			{
				for (int i = 0; i < AnimTexTable.Count; i++)
				{
					if (AnimTexTable[i].Name == param[1])
					{
						CAnimationCharaPlane t = new CAnimationCharaPlane();
						t.Name = param[1];
						t.CharaType = int.Parse(param[2]);
						int x = int.Parse(param[3]);
						int y = int.Parse(param[4]);

						t.Alpha = 255.0f; // ここを0にすればフェードインするようになる
						t.Flag = true;
						t.X = x;
						t.Y = y;
						for (int j = 0; j < 20; j++)
						{
							t.GraphHandles[j] = AnimTexTable[i].GraphHandles[j];
						}
						AnimCharaPlane.Add(t);
						break;
					}
				}
			}
		}
		void CharaDisp()
		{
			for (int i = 0; i < OneCharaPlane.Count; i++)
			{
				//DrawFormatString( 250, 15*i, GetColor(255,255,255), "%s %d %d %f", OneCharPlane[i].Name.c_str(), OneCharPlane[i].X, OneCharPlane[i].Y, OneCharPlane[i].Alpha );
				if (OneCharaPlane[i].GraphHandle != -1)
				{
					//登場α処理
					if (OneCharaPlane[i].Flag)
					{
						OneCharaPlane[i].Alpha += 2;
					}
					else
					{
						OneCharaPlane[i].Alpha -= 2;
					}

					if ((int)OneCharaPlane[i].Alpha > 255)
					{
						OneCharaPlane[i].Alpha = 255;
					}
					// アルファが0以下ならキャラを削除
					if ((int)OneCharaPlane[i].Alpha <= 0)
					{
						OneCharaPlane[i].Alpha = 0;
					}
					DX.SetDrawBlendMode(DX.DX_BLENDMODE_ALPHA, (int)OneCharaPlane[i].Alpha);
					DX.DrawGraph(OneCharaPlane[i].X, OneCharaPlane[i].Y, OneCharaPlane[i].GraphHandle, 1);
					DX.SetDrawBlendMode(DX.DX_BLENDMODE_NOBLEND, 0);
				}
			}

			for (int i = OneCharaPlane.Count - 1; i >= 0; --i)
			{
				if (OneCharaPlane[i].GraphHandle != -1)
				{
					// アルファが0以下ならキャラを削除
					if ((int)OneCharaPlane[i].Alpha <= 0 && OneCharaPlane[i].Flag == false)
					{
						OneCharaPlane.RemoveAt(i);
					}
				}
			}
		}
		void DivCharaDisp()
		{
			for (int i = 0; i < PluralsCharaPlane.Count; i++)
			{
				//DrawFormatString( 250, 15*i, GetColor(255,255,255), "%s %d %d %f", PluralsCharPlane[i].Name.c_str(), PluralsCharPlane[i].X, PluralsCharPlane[i].Y, PluralsCharPlane[i].Alpha );
				if (PluralsCharaPlane[i].GraphHandles != null)
				{
					//登場α処理
					if (PluralsCharaPlane[i].Flag)
					{
						PluralsCharaPlane[i].Alpha += 2;
					}
					else
					{
						PluralsCharaPlane[i].Alpha -= 2;
					}

					if ((int)PluralsCharaPlane[i].Alpha > 255)
					{
						PluralsCharaPlane[i].Alpha = 255;
					}
					// アルファが0以下ならキャラを削除
					if ((int)PluralsCharaPlane[i].Alpha <= 0)
					{
						PluralsCharaPlane[i].Alpha = 0;
					}
					DX.SetDrawBlendMode(DX.DX_BLENDMODE_ALPHA, (int)PluralsCharaPlane[i].Alpha);
					DX.DrawGraph(PluralsCharaPlane[i].X, PluralsCharaPlane[i].Y, PluralsCharaPlane[i].GraphHandles[PluralsCharaPlane[i].CharaNum], 1);
					DX.SetDrawBlendMode(DX.DX_BLENDMODE_NOBLEND, 0);
				}
			}

			for (int i = PluralsCharaPlane.Count - 1; i >= 0; --i)
			{
				if (PluralsCharaPlane[i].GraphHandles != null)
				{
					// アルファが0以下ならキャラを削除
					if ((int)PluralsCharaPlane[i].Alpha <= 0 && PluralsCharaPlane[i].Flag == false)
					{
						PluralsCharaPlane.RemoveAt(i);
					}
				}
			}
		}
		void AnimCharaDisp()
		{
			for (int i = 0; i < AnimCharaPlane.Count; i++)
			{
				//DrawFormatString( 250, 15*i, GetColor(255,255,255), "%s %d %d %f", OneCharPlane[i].Name.c_str(), OneCharPlane[i].X, OneCha			rPlane[i].Y, OneCharPlane[i].Alpha );
				int t = AnimCharaPlane[i].CharaType;
				if (AnimCharaPlane[i].GraphHandles[t] != -1)
				{
					//登場α処理
					if (AnimCharaPlane[i].Flag)
					{
						AnimCharaPlane[i].Alpha += 2;
					}
					else
					{
						AnimCharaPlane[i].Alpha -= 2;
					}

					if ((int)AnimCharaPlane[i].Alpha > 255)
					{
						AnimCharaPlane[i].Alpha = 255;
					}
					// アルファが0以下ならキャラを削除
					if ((int)AnimCharaPlane[i].Alpha <= 0)
					{
						AnimCharaPlane[i].Alpha = 0;
					}
					DX.SetDrawBlendMode(DX.DX_BLENDMODE_ALPHA, (int)AnimCharaPlane[i].Alpha);
					DX.DrawGraph(AnimCharaPlane[i].X, AnimCharaPlane[i].Y, AnimCharaPlane[i].GraphHandles[t], 1);
					DX.SetDrawBlendMode(DX.DX_BLENDMODE_NOBLEND, 0);
				}
			}

			for (int i = AnimCharaPlane.Count - 1; i >= 0; --i)
			{
				// アルファが0以下ならキャラを削除
				if ((int)AnimCharaPlane[i].Alpha <= 0 && AnimCharaPlane[i].Flag == false)
				{
					AnimCharaPlane.RemoveAt(i);
				}
			}
		}
		void CharaClear()
		{
			System.StringSplitOptions option = System.StringSplitOptions.RemoveEmptyEntries;
			string[] param = ScriptBuff[ReadY].Split(new char[] { ',', ' ' }, option);
			for (int i = 0; i < OneCharaPlane.Count; i++)
			{
				if (param[1] == OneCharaPlane[i].Name)
				{
					int x = int.Parse(param[2]);
					int y = int.Parse(param[3]);
					if (x == OneCharaPlane[i].X && y == OneCharaPlane[i].Y)
					{
						OneCharaPlane[i].Alpha = 0.0f;
						OneCharaPlane[i].Flag = false;
					}
				}
			}
		}
		void DivCharaClear()
		{
			System.StringSplitOptions option = System.StringSplitOptions.RemoveEmptyEntries;
			string[] param = ScriptBuff[ReadY].Split(new char[] { ',', ' ' }, option);
			for (int i = 0; i < PluralsCharaPlane.Count; i++)
			{
				if (param[1] == PluralsCharaPlane[i].Name)
				{
					int x = int.Parse(param[2]);
					int y = int.Parse(param[3]);
					if (x == PluralsCharaPlane[i].X && y == PluralsCharaPlane[i].Y)
					{
						PluralsCharaPlane[i].Alpha = 0.0f;
						PluralsCharaPlane[i].Flag = false;
					}
				}
			}
		}
		void AnimCharaClear()
		{
			System.StringSplitOptions option = System.StringSplitOptions.RemoveEmptyEntries;
			string[] param = ScriptBuff[ReadY].Split(new char[] { ',', ' ' }, option);
			for (int i = 0; i < AnimCharaPlane.Count; i++)
			{
				if (param[1] == AnimCharaPlane[i].Name)
				{
					int x = int.Parse(param[2]);
					int y = int.Parse(param[3]);
					if (x == AnimCharaPlane[i].X && y == AnimCharaPlane[i].Y)
					{
						AnimCharaPlane[i].Alpha = 0.0f;
						AnimCharaPlane[i].Flag = false;
					}
				}
			}
		}
		void SceneClear(int cursol_type)
		{
			// cursol_type1ならカーソルを戻す
			if (cursol_type == 1)
			{
				ReadX = 0;
				ReadY = 0;
				DrawBoxFlag = false;
			}
			OneCharaPlane.Clear();
			DispMessage.Clear();
			DispMessage.Add(string.Empty);
		}
		void InitSelect()
		{
			SelectPoint = 0;
			SelectMessage = string.Empty;
			SelectTable.Clear();
		}
		void SetCommando()
		{
			System.StringSplitOptions option = System.StringSplitOptions.RemoveEmptyEntries;
			string[] param = ScriptBuff[ReadY].Split(new char[] { ',', ' ' }, option);
			int sel_num = int.Parse(param[1]); //選択肢の数を取得する
			SelectFlag = true;      //選択肢決定待ち状態へ								
			InitSelect();//一回セレクトテーブルをクリアする

			// 答えの数分繰り返す
			for (int i = 0; i < sel_num; i++)
			{
				ReadY++;
				if (string.IsNullOrWhiteSpace(ScriptBuff[ReadY]))
				{
					MessageBox.Show("セレクト数に対して答え数が足りません");
					break;
				}
				param = ScriptBuff[ReadY].Split(new char[] { ',', ' ' }, option);
				param[0] = param[0].Replace("#", "");
				// 答えコマンドなら
				if (param[0] == "ans")
				{
					CSelectTable temp_select_table = new CSelectTable();
					// ジャンプ先を保存する
					temp_select_table.SelectJump = param[1];
					ReadY++;
					// 終端文字まで答えの文章をコピーする
					for (int j = 0; j < ScriptBuff.Count; j++)
					{
						// 一行コピー
						temp_select_table.SelectMessage.Add(ScriptBuff[ReadY]);
						if (temp_select_table.SelectMessage[j].Contains(";"))
						{
							temp_select_table.SelectMessage[j] = temp_select_table.SelectMessage[j].Replace(";", "");
							break;
						}
						ReadY++;
					}
					SelectTable.Add(temp_select_table);
				}
				else // ansコマンドでなく最大行数以下ならもう1回繰り返す
				{
					if (ReadY <= ScriptBuff.Count) i--;
				}
			}
		}
		// num番目のラペルにジャンプする
		void MoveJumpPoint(int num)
		{
			for (int i = 0; i < ScriptBuff.Count; i++)
			{
				if (ScriptBuff[i][0] == '#')
				{
					// パラメーター取得
					System.StringSplitOptions option = System.StringSplitOptions.RemoveEmptyEntries;
					string[] param = ScriptBuff[i].Split(new char[] { ',', ' ' }, option);
					param[0] = param[0].Replace("#", "");
					if (param[0] == "label")
					{
						if (num == int.Parse(param[1]))
						{
							ReadY = i;
							break;
						}
					}
				}
			}
		}
		public void CheckKey()
		{
			if (GetPadKey(EINPUT_TYPE.Shot) == 1)
			{
				if (EnterFlag)
				{
					EnterFlag = false;
				}
				else if (PageChange)
				{
					PageChange = false;
					ReadX = 0;
					DispMessage.Clear();
					DispMessage.Add("");
				}
				//選択肢決定
				else if (SelectFlag)
				{
					SelectFlag = false;
					//テキストポイント初期位置に戻す。
					ReadY = 0;
					ReadX = 0;
					DispMessage.Clear();
					DispMessage.Add("");
					int num = int.Parse(SelectTable[SelectPoint].SelectJump);
					MoveJumpPoint(num);
				}
			}
			if (GetPadKey(EINPUT_TYPE.Bom) == 1)
			{
				SkipFlag = true;
				if (EnterFlag)
				{
					EnterFlag = false;
				}
				else if (PageChange)
				{
					PageChange = false;
					ReadX = 0;
					DispMessage.Clear();
					DispMessage.Add("");
				}
			}
			//選択肢操作
			if (SelectFlag)
			{
				if (GetPadKey(EINPUT_TYPE.Up) == 1)
				{
					//選択肢をひとつ上に
					SelectPoint--;
					if (SelectPoint < 0) { SelectPoint = 0; }
				}
				if (GetPadKey(EINPUT_TYPE.Down) == 1)
				{
					//もし1つ下が使用されているなら1下に
					//if (SelectTable[SelectPoint + 1].Use == true)
					if (SelectTable.Count > SelectPoint)
					{
						SelectPoint++;
					}
				}
			}
		}
		public void TextDisp()
		{
			TextDisp1();
			TextDisp2();
		}

		void TextDisp1()
		{
			BackDisp();
			CharaDisp();
			DivCharaDisp();
			AnimCharaDisp();
		}

		void TextDisp2()
		{
			if (DrawBoxFlag)
			{
				// 背景を暗く
				DX.SetDrawBlendMode(DX.DX_BLENDMODE_ALPHA, 120);
				// バックを暗くする
				DX.DrawBox(BOX_START_X, BOX_START_Y, 640, 480, DX.GetColor(0, 0, 0), 1);
				// 背景を明るく戻す
				DX.SetDrawBlendMode(DX.DX_BLENDMODE_NOBLEND, 0);
			}

			SelectDisp();
			for (int i = 0; i < DispMessage.Count; i++)
			{
				DX.DrawString(STR_START_X, STR_START_Y + i * 15, DispMessage[i], FontColor[i]);
			}
		}

		void BackDisp()
		{
			if (BackBmp != -1)
			{
				DX.DrawGraph(0, 0, BackBmp, 1);
			}
		}

		//------------------------------
		//選択肢表示
		void SelectDisp()
		{
			int temp_y = 0;
			//フラグが立っているなら
			if (SelectFlag)
			{
				//文字描画
				for (int i = 0; i < SelectTable.Count; ++i)
				{
					for (int j = 0; j < SelectTable[i].SelectMessage.Count; ++j)
					{
						if (string.IsNullOrWhiteSpace(SelectTable[i].SelectMessage[j]))
						{
							temp_y += j - 1;
							break;
						}
						DX.DrawString(SELECT_STR_X, SELECT_STR_Y + ((i + j + temp_y) * SELECT_STR_DIST),
							SelectTable[i].SelectMessage[j],
							SelectPoint == i ? DX.GetColor(255, 255, 255) : DX.GetColor(0, 0, 255));
					}
				}
			}
		}
	}
}

未分類

Posted by ジェイ