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));
}
}
}
}
}
}