using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using NTERA.EmuEra.Game.EraEmu.GameData;
using NTERA.EmuEra.Game.EraEmu.GameData.Expression;
using NTERA.EmuEra.Game.EraEmu.Sub;
namespace NTERA.EmuEra.Game.EraEmu.Config
{
///
/// プログラム全体で使用される値でWindow作成前に設定して以後変更されないもの
/// (という予定だったが今は違う)
/// 1756 Config → ConfigDataへ改名
///
internal sealed class ConfigData
{
static readonly string configPath = Program.ExeDir + "emuera.config";
static readonly string configdebugPath = Program.DebugDir + "debug.config";
static ConfigData() { }
private static ConfigData instance = new ConfigData();
public static ConfigData Instance => instance;
private ConfigData() { setDefault(); }
//適当に大き目の配列を作っておく。
private AConfigItem[] configArray = new AConfigItem[85];
private AConfigItem[] replaceArray = new AConfigItem[50];
private AConfigItem[] debugArray = new AConfigItem[20];
private void setDefault()
{
int i = 0;
configArray[i++] = new ConfigItem(ConfigCode.IgnoreCase, "大文字小文字の違いを無視する", true);
configArray[i++] = new ConfigItem(ConfigCode.UseRenameFile, "_Rename.csvを利用する", false);
configArray[i++] = new ConfigItem(ConfigCode.UseReplaceFile, "_Replace.csvを利用する", true);
configArray[i++] = new ConfigItem(ConfigCode.UseMouse, "マウスを使用する", true);
configArray[i++] = new ConfigItem(ConfigCode.UseMenu, "メニューを使用する", true);
configArray[i++] = new ConfigItem(ConfigCode.UseDebugCommand, "デバッグコマンドを使用する", false);
configArray[i++] = new ConfigItem(ConfigCode.AllowMultipleInstances, "多重起動を許可する", true);
configArray[i++] = new ConfigItem(ConfigCode.AutoSave, "オートセーブを行なう", true);
configArray[i++] = new ConfigItem(ConfigCode.UseKeyMacro, "キーボードマクロを使用する", true);
configArray[i++] = new ConfigItem(ConfigCode.SizableWindow, "ウィンドウの高さを可変にする", true);
configArray[i++] = new ConfigItem(ConfigCode.TextDrawingMode, "描画インターフェース", TextDrawingMode.GRAPHICS);
//configArray[i++] = new ConfigItem(ConfigCode.UseImageBuffer, "イメージバッファを使用する", true);
configArray[i++] = new ConfigItem(ConfigCode.WindowX, "ウィンドウ幅", 760);
configArray[i++] = new ConfigItem(ConfigCode.WindowY, "ウィンドウ高さ", 480);
configArray[i++] = new ConfigItem(ConfigCode.WindowPosX, "ウィンドウ位置X", 0);
configArray[i++] = new ConfigItem(ConfigCode.WindowPosY, "ウィンドウ位置Y", 0);
configArray[i++] = new ConfigItem(ConfigCode.SetWindowPos, "起動時のウィンドウ位置を指定する", false);
configArray[i++] = new ConfigItem(ConfigCode.WindowMaximixed, "起動時にウィンドウを最大化する", false);
configArray[i++] = new ConfigItem(ConfigCode.MaxLog, "履歴ログの行数", 5000);
configArray[i++] = new ConfigItem(ConfigCode.PrintCPerLine, "PRINTCを並べる数", 3);
configArray[i++] = new ConfigItem(ConfigCode.PrintCLength, "PRINTCの文字数", 25);
configArray[i++] = new ConfigItem(ConfigCode.FontName, "フォント名", "MS ゴシック");
configArray[i++] = new ConfigItem(ConfigCode.FontSize, "フォントサイズ", 18);
configArray[i++] = new ConfigItem(ConfigCode.LineHeight, "一行の高さ", 19);
configArray[i++] = new ConfigItem(ConfigCode.ForeColor, "文字色", Color.FromArgb(192, 192, 192));//LIGHTGRAY
configArray[i++] = new ConfigItem(ConfigCode.BackColor, "背景色", Color.FromArgb(0, 0, 0));//BLACK
configArray[i++] = new ConfigItem(ConfigCode.FocusColor, "選択中文字色", Color.FromArgb(255, 255, 0));//YELLOW
configArray[i++] = new ConfigItem(ConfigCode.LogColor, "履歴文字色", Color.FromArgb(192, 192, 192));//LIGHTGRAY//Color.FromArgb(128, 128, 128);//GRAY
configArray[i++] = new ConfigItem(ConfigCode.FPS, "フレーム毎秒", 5);
configArray[i++] = new ConfigItem(ConfigCode.SkipFrame, "最大スキップフレーム数", 3);
configArray[i++] = new ConfigItem(ConfigCode.ScrollHeight, "スクロール行数", 1);
configArray[i++] = new ConfigItem(ConfigCode.InfiniteLoopAlertTime, "無限ループ警告までのミリ秒数", 5000);
configArray[i++] = new ConfigItem(ConfigCode.DisplayWarningLevel, "表示する最低警告レベル", 1);
configArray[i++] = new ConfigItem(ConfigCode.DisplayReport, "ロード時にレポートを表示する", false);
configArray[i++] = new ConfigItem(ConfigCode.ReduceArgumentOnLoad, "ロード時に引数を解析する", ReduceArgumentOnLoadFlag.NO);
//configArray[i++] = new ConfigItem(ConfigCode.ReduceFormattedStringOnLoad, "ロード時にFORM文字列を解析する", true);
configArray[i++] = new ConfigItem(ConfigCode.IgnoreUncalledFunction, "呼び出されなかった関数を無視する", true);
configArray[i++] = new ConfigItem(ConfigCode.FunctionNotFoundWarning, "関数が見つからない警告の扱い", DisplayWarningFlag.IGNORE);
configArray[i++] = new ConfigItem(ConfigCode.FunctionNotCalledWarning, "関数が呼び出されなかった警告の扱い", DisplayWarningFlag.IGNORE);
//configArray[i++] = new ConfigItem>(ConfigCode.IgnoreWarningFiles, "指定したファイル中の警告を無視する", new List());
configArray[i++] = new ConfigItem(ConfigCode.ChangeMasterNameIfDebug, "デバッグコマンドを使用した時にMASTERの名前を変更する", true);
configArray[i++] = new ConfigItem(ConfigCode.ButtonWrap, "ボタンの途中で行を折りかえさない", false);
configArray[i++] = new ConfigItem(ConfigCode.SearchSubdirectory, "サブディレクトリを検索する", false);
configArray[i++] = new ConfigItem(ConfigCode.SortWithFilename, "読み込み順をファイル名順にソートする", false);
configArray[i++] = new ConfigItem(ConfigCode.LastKey, "最終更新コード", 0);
configArray[i++] = new ConfigItem(ConfigCode.SaveDataNos, "表示するセーブデータ数", 20);
configArray[i++] = new ConfigItem(ConfigCode.WarnBackCompatibility, "eramaker互換性に関する警告を表示する", true);
configArray[i++] = new ConfigItem(ConfigCode.AllowFunctionOverloading, "システム関数の上書きを許可する", true);
configArray[i++] = new ConfigItem(ConfigCode.WarnFunctionOverloading, "システム関数が上書きされたとき警告を表示する", true);
configArray[i++] = new ConfigItem(ConfigCode.TextEditor, "関連づけるテキストエディタ", "notepad");
configArray[i++] = new ConfigItem(ConfigCode.EditorType, "テキストエディタコマンドライン指定", TextEditorType.USER_SETTING);
configArray[i++] = new ConfigItem(ConfigCode.EditorArgument, "エディタに渡す行指定引数", "");
configArray[i++] = new ConfigItem(ConfigCode.WarnNormalFunctionOverloading, "同名の非イベント関数が複数定義されたとき警告する", false);
configArray[i++] = new ConfigItem(ConfigCode.CompatiErrorLine, "解釈不可能な行があっても実行する", false);
configArray[i++] = new ConfigItem(ConfigCode.CompatiCALLNAME, "CALLNAMEが空文字列の時にNAMEを代入する", false);
configArray[i++] = new ConfigItem(ConfigCode.UseSaveFolder, "セーブデータをsavフォルダ内に作成する", false);
configArray[i++] = new ConfigItem(ConfigCode.CompatiRAND, "擬似変数RANDの仕様をeramakerに合わせる", false);
configArray[i++] = new ConfigItem(ConfigCode.CompatiDRAWLINE, "DRAWLINEを常に新しい行で行う", false);
configArray[i++] = new ConfigItem(ConfigCode.CompatiFunctionNoignoreCase, "関数・属性については大文字小文字を無視しない", false); ;
configArray[i++] = new ConfigItem(ConfigCode.SystemAllowFullSpace, "全角スペースをホワイトスペースに含める", true);
configArray[i++] = new ConfigItem(ConfigCode.SystemSaveInUTF8, "セーブデータをUTF-8で保存する", false);
configArray[i++] = new ConfigItem(ConfigCode.CompatiLinefeedAs1739, "ver1739以前の非ボタン折り返しを再現する", false);
configArray[i++] = new ConfigItem(ConfigCode.useLanguage, "内部で使用する東アジア言語", UseLanguage.JAPANESE);
configArray[i++] = new ConfigItem(ConfigCode.AllowLongInputByMouse, "ONEINPUT系命令でマウスによる2文字以上の入力を許可する", false);
configArray[i++] = new ConfigItem(ConfigCode.CompatiCallEvent, "イベント関数のCALLを許可する", false);
configArray[i++] = new ConfigItem(ConfigCode.CompatiSPChara, "SPキャラを使用する", false);
configArray[i++] = new ConfigItem(ConfigCode.SystemSaveInBinary, "セーブデータをバイナリ形式で保存する", true);
configArray[i++] = new ConfigItem(ConfigCode.CompatiFuncArgOptional, "ユーザー関数の全ての引数の省略を許可する", false);
configArray[i++] = new ConfigItem(ConfigCode.CompatiFuncArgAutoConvert, "ユーザー関数の引数に自動的にTOSTRを補完する", false);
configArray[i++] = new ConfigItem(ConfigCode.SystemIgnoreTripleSymbol, "FORM中の三連記号を展開しない", false);
configArray[i++] = new ConfigItem(ConfigCode.TimesNotRigorousCalculation, "TIMESの計算をeramakerにあわせる", false);
//一文字変数の禁止オプションを考えた名残
//configArray[i++] = new ConfigItem(ConfigCode.ForbidOneCodeVariable, "一文字変数の使用を禁止する", false);
configArray[i++] = new ConfigItem(ConfigCode.SystemNoTarget, "キャラクタ変数の引数を補完しない", false);
configArray[i++] = new ConfigItem(ConfigCode.CBUseClipboard, "Clipboard- Copy text to Clipboard during Game", true);
configArray[i++] = new ConfigItem(ConfigCode.CBIgnoreTags, "Clipboard- ignore <> tags in text", false);
configArray[i++] = new ConfigItem(ConfigCode.CBReplaceTags, "Clipboard- Replace <> with this", ".");
configArray[i++] = new ConfigItem(ConfigCode.CBNewLinesOnly, "Clipboard- Show new lines only", true);
configArray[i++] = new ConfigItem(ConfigCode.CBClearBuffer, "Clipboard- Clear Buffer when game clears screen", false);
configArray[i++] = new ConfigItem(ConfigCode.CBTriggerLeftClick, "Clipboard- LeftClick Trigger", true);
configArray[i++] = new ConfigItem(ConfigCode.CBTriggerMiddleClick, "Clipboard- MiddleClick Trigger", false);
configArray[i++] = new ConfigItem(ConfigCode.CBTriggerDoubleLeftClick, "Clipboard- Double Left Click Trigger", false);
configArray[i++] = new ConfigItem(ConfigCode.CBTriggerAnyKeyWait, "Clipboard- AnyKey Wait Trigger ", false);
configArray[i++] = new ConfigItem(ConfigCode.CBTriggerInputWait, "Clipboard- Wait for Input Trigger", true);
configArray[i++] = new ConfigItem(ConfigCode.CBMaxCB, "Clipboard- Length of Clipboard", 25);
configArray[i++] = new ConfigItem(ConfigCode.CBBufferSize, "Clipboard- Buffer Size", 300);
configArray[i++] = new ConfigItem(ConfigCode.CBScrollCount, "Clipboard- Scrolled Lines per Key", 5);
configArray[i++] = new ConfigItem(ConfigCode.CBMinTimer, "Clipboard- min time between pastes", 800);
configArray[i++] = new ConfigItem(ConfigCode.AnchorCustomIcon, "Anchor- Path to a custom window icon (PNG)", "");
i = 0;
debugArray[i++] = new ConfigItem(ConfigCode.DebugShowWindow, "起動時にデバッグウインドウを表示する", true);
debugArray[i++] = new ConfigItem(ConfigCode.DebugWindowTopMost, "デバッグウインドウを最前面に表示する", true);
debugArray[i++] = new ConfigItem(ConfigCode.DebugWindowWidth, "デバッグウィンドウ幅", 400);
debugArray[i++] = new ConfigItem(ConfigCode.DebugWindowHeight, "デバッグウィンドウ高さ", 300);
debugArray[i++] = new ConfigItem(ConfigCode.DebugSetWindowPos, "デバッグウィンドウ位置を指定する", false);
debugArray[i++] = new ConfigItem(ConfigCode.DebugWindowPosX, "デバッグウィンドウ位置X", 0);
debugArray[i++] = new ConfigItem(ConfigCode.DebugWindowPosY, "デバッグウィンドウ位置Y", 0);
i = 0;
replaceArray[i++] = new ConfigItem(ConfigCode.MoneyLabel, "お金の単位", "$");
replaceArray[i++] = new ConfigItem(ConfigCode.MoneyFirst, "単位の位置", true);
replaceArray[i++] = new ConfigItem(ConfigCode.LoadLabel, "起動時簡略表示", "Now Loading...");
replaceArray[i++] = new ConfigItem(ConfigCode.MaxShopItem, "販売アイテム数", 100);
replaceArray[i++] = new ConfigItem(ConfigCode.DrawLineString, "DRAWLINE文字", "-");
replaceArray[i++] = new ConfigItem(ConfigCode.BarChar1, "BAR文字1", '*');
replaceArray[i++] = new ConfigItem(ConfigCode.BarChar2, "BAR文字2", '.');
replaceArray[i++] = new ConfigItem(ConfigCode.TitleMenuString0, "システムメニュー0", "Start a game");
replaceArray[i++] = new ConfigItem(ConfigCode.TitleMenuString1, "システムメニュー1", "Load a save");
replaceArray[i++] = new ConfigItem(ConfigCode.ComAbleDefault, "COM_ABLE初期値", 1);
replaceArray[i++] = new ConfigItem>(ConfigCode.StainDefault, "汚れの初期値", new List(new Int64[] { 0, 0, 2, 1, 8 }));
replaceArray[i++] = new ConfigItem(ConfigCode.TimeupLabel, "時間切れ表示", "時間切れ");
replaceArray[i++] = new ConfigItem>(ConfigCode.ExpLvDef, "EXPLVの初期値", new List(new Int64[] { 0, 1, 4, 20, 50, 200 }));
replaceArray[i++] = new ConfigItem>(ConfigCode.PalamLvDef, "PALAMLVの初期値", new List(new Int64[] { 0, 100, 500, 3000, 10000, 30000, 60000, 100000, 150000, 250000 }));
replaceArray[i++] = new ConfigItem(ConfigCode.pbandDef, "PBANDの初期値", 4);
replaceArray[i++] = new ConfigItem(ConfigCode.RelationDef, "RELATIONの初期値", 0);
}
public ConfigData Copy()
{
ConfigData config = new ConfigData();
for (int i = 0; i < configArray.Length; i++)
if ((configArray[i] != null) && (config.configArray[i] != null))
configArray[i].CopyTo(config.configArray[i]);
for (int i = 0; i < configArray.Length; i++)
if ((configArray[i] != null) && (config.configArray[i] != null))
configArray[i].CopyTo(config.configArray[i]);
for (int i = 0; i < replaceArray.Length; i++)
if ((replaceArray[i] != null) && (config.replaceArray[i] != null))
replaceArray[i].CopyTo(config.replaceArray[i]);
return config;
}
public Dictionary GetConfigNameDic()
{
Dictionary ret = new Dictionary();
foreach (AConfigItem item in configArray)
{
if (item != null)
ret.Add(item.Code, item.Text);
}
return ret;
}
public T GetConfigValue(ConfigCode code)
{
AConfigItem item = GetItem(code);
//if ((item != null) && (item is ConfigItem))
return ((ConfigItem)item).Value;
//throw new ExeEE("GetConfigValueのCodeまたは型が不適切");
}
#region getitem
public AConfigItem GetItem(ConfigCode code)
{
AConfigItem item = GetConfigItem(code);
if (item == null)
{
item = GetReplaceItem(code);
if (item == null)
{
item = GetDebugItem(code);
}
}
return item;
}
public AConfigItem GetItem(string key)
{
AConfigItem item = GetConfigItem(key);
if (item == null)
{
item = GetReplaceItem(key);
if (item == null)
{
item = GetDebugItem(key);
}
}
return item;
}
public AConfigItem GetConfigItem(ConfigCode code)
{
foreach (AConfigItem item in configArray)
{
if (item == null)
continue;
if (item.Code == code)
return item;
}
return null;
}
public AConfigItem GetConfigItem(string key)
{
foreach (AConfigItem item in configArray)
{
if (item == null)
continue;
if (item.Name == key)
return item;
if (item.Text == key)
return item;
}
return null;
}
public AConfigItem GetReplaceItem(ConfigCode code)
{
foreach (AConfigItem item in replaceArray)
{
if (item == null)
continue;
if (item.Code == code)
return item;
}
return null;
}
public AConfigItem GetReplaceItem(string key)
{
foreach (AConfigItem item in replaceArray)
{
if (item == null)
continue;
if (item.Name == key)
return item;
if (item.Text == key)
return item;
}
return null;
}
public AConfigItem GetDebugItem(ConfigCode code)
{
foreach (AConfigItem item in debugArray)
{
if (item == null)
continue;
if (item.Code == code)
return item;
}
return null;
}
public AConfigItem GetDebugItem(string key)
{
foreach (AConfigItem item in debugArray)
{
if (item == null)
continue;
if (item.Name == key)
return item;
if (item.Text == key)
return item;
}
return null;
}
public SingleTerm GetConfigValueInERB(string text, ref string errMes)
{
AConfigItem item = Instance.GetItem(text);
if(item == null)
{
errMes = "文字列\"" + text + "\"は適切なコンフィグ名ではありません";
return null;
}
SingleTerm term;
switch(item.Code)
{
//
case ConfigCode.AutoSave://"オートセーブを行なう"
case ConfigCode.MoneyFirst://"単位の位置"
if(item.GetValue())
term = new SingleTerm(1);
else
term = new SingleTerm(0);
break;
//
case ConfigCode.WindowX:// "ウィンドウ幅"
case ConfigCode.PrintCPerLine:// "PRINTCを並べる数"
case ConfigCode.PrintCLength:// "PRINTCの文字数"
case ConfigCode.FontSize:// "フォントサイズ"
case ConfigCode.LineHeight:// "一行の高さ"
case ConfigCode.SaveDataNos:// "表示するセーブデータ数"
case ConfigCode.MaxShopItem:// "販売アイテム数"
case ConfigCode.ComAbleDefault:// "COM_ABLE初期値"
term = new SingleTerm(item.GetValue());
break;
//
case ConfigCode.ForeColor://"文字色"
case ConfigCode.BackColor://"背景色"
case ConfigCode.FocusColor://"選択中文字色"
case ConfigCode.LogColor://"履歴文字色"
{
Color color = item.GetValue();
term = new SingleTerm( ((color.R * 256) + color.G) * 256 + color.B);
}
break;
//
case ConfigCode.pbandDef:// "PBANDの初期値"
case ConfigCode.RelationDef:// "RELATIONの初期値"
term = new SingleTerm(item.GetValue());
break;
//
case ConfigCode.FontName:// "フォント名"
case ConfigCode.MoneyLabel:// "お金の単位"
case ConfigCode.LoadLabel:// "起動時簡略表示"
case ConfigCode.DrawLineString:// "DRAWLINE文字"
case ConfigCode.TitleMenuString0:// "システムメニュー0"
case ConfigCode.TitleMenuString1:// "システムメニュー1"
case ConfigCode.TimeupLabel:// "時間切れ表示"
term = new SingleTerm(item.GetValue());
break;
//
case ConfigCode.BarChar1:// "BAR文字1"
case ConfigCode.BarChar2:// "BAR文字2"
term = new SingleTerm(item.GetValue().ToString());
break;
//
case ConfigCode.TextDrawingMode:// "描画インターフェース"
term = new SingleTerm(item.GetValue().ToString());
break;
default:
{
errMes = "コンフィグ文字列\"" + text + "\"の値の取得は許可されていません";
return null;
}
}
return term;
}
#endregion
public bool SaveConfig()
{
StreamWriter writer = null;
try
{
writer = new StreamWriter(configPath, false, Config.Encode);
for (int i = 0; i < configArray.Length; i++)
{
AConfigItem item = configArray[i];
if (item == null)
continue;
//1806beta001 CompatiDRAWLINEの廃止、CompatiLinefeedAs1739へ移行
if (item.Code == ConfigCode.CompatiDRAWLINE)
continue;
if ((item.Code == ConfigCode.ChangeMasterNameIfDebug) && (item.GetValue()))
continue;
if ((item.Code == ConfigCode.LastKey) && (item.GetValue() == 0))
continue;
//if (item.Code == ConfigCode.IgnoreWarningFiles)
//{
// List files = item.GetValue>();
// foreach (string filename in files)
// writer.WriteLine(item.Text + ":" + filename.ToString());
// continue;
//}
writer.WriteLine(item.ToString());
}
}
catch (Exception)
{
return false;
}
finally
{
if (writer != null)
writer.Close();
}
return true;
}
public bool ReLoadConfig()
{
//_fixed.configの中身が変わった場合、非固定になったものが保持されてしまうので、ここで一旦すべて解除
foreach (AConfigItem item in configArray)
{
if (item == null)
continue;
if (item.Fixed)
item.Fixed = false;
}
LoadConfig();
return true;
}
public bool LoadConfig()
{
Config.ClearFont();
string defaultConfigPath = Program.CsvDir + "_default.config";
string fixedConfigPath = Program.CsvDir + "_fixed.config";
if(!File.Exists(defaultConfigPath))
defaultConfigPath = Program.CsvDir + "default.config";
if (!File.Exists(fixedConfigPath))
fixedConfigPath = Program.CsvDir + "fixed.config";
loadConfig(defaultConfigPath, false);
loadConfig(configPath, false);
loadConfig(fixedConfigPath, true);
Config.SetConfig(this);
bool needSave = false;
if (!File.Exists(configPath))
needSave = true;
if (Config.CheckUpdate())
{
GetItem(ConfigCode.LastKey).SetValue(Config.LastKey);
needSave = true;
}
if (needSave)
SaveConfig();
return true;
}
private bool loadConfig(string confPath, bool fix)
{
if (!File.Exists(confPath))
return false;
EraStreamReader eReader = new EraStreamReader(false);
if (!eReader.Open(confPath))
return false;
ScriptPosition pos = null;
try
{
string line = null;
//bool defineIgnoreWarningFiles = false;
while ((line = eReader.ReadLine()) != null)
{
if ((line.Length == 0) || (line[0] == ';'))
continue;
pos = new ScriptPosition(eReader.Filename, eReader.LineNo, line);
string[] tokens = line.Split(':');
if (tokens.Length < 2)
continue;
AConfigItem item = GetConfigItem(tokens[0].Trim());
if (item != null)
{
//1806beta001 CompatiDRAWLINEの廃止、CompatiLinefeedAs1739へ移行
if(item.Code == ConfigCode.CompatiDRAWLINE)
{
item = GetConfigItem(ConfigCode.CompatiLinefeedAs1739);
}
//if ((item.Code == ConfigCode.IgnoreWarningFiles))
//{
// if (!defineIgnoreWarningFiles)
// (item.GetValue>()).Clear();
// defineIgnoreWarningFiles = true;
// if ((item.Fixed) && (fix))
// item.Fixed = false;
//}
if (item.Code == ConfigCode.TextEditor)
{
//パスの関係上tokens[2]は使わないといけない
if (tokens.Length > 2)
{
if (tokens[2].StartsWith("\\"))
tokens[1] += ":" + tokens[2];
if (tokens.Length > 3)
{
for (int i = 3; i < tokens.Length; i++)
{
tokens[1] += ":" + tokens[i];
}
}
}
}
if (item.Code == ConfigCode.EditorArgument)
{
//半角スペースを要求する引数が必要なエディタがあるので別処理で
((ConfigItem)item).Value = tokens[1];
continue;
}
if (item.Code == ConfigCode.MaxLog)
{
//解析モード時はここを上書きして十分な長さを確保する
tokens[1] = "10000";
}
if ((item.TryParse(tokens[1])) && (fix))
item.Fixed = true;
}
#if DEBUG
//else
// throw new Exception("コンフィグファイルが変");
#endif
}
}
catch (EmueraException ee)
{
ParserMediator.ConfigWarn(ee.Message, pos, 1, null);
}
catch (Exception exc)
{
ParserMediator.ConfigWarn(exc.GetType() + ":" + exc.Message, pos, 1, exc.StackTrace);
}
finally { eReader.Dispose(); }
return true;
}
#region replace
// 1.52a改変部分 (単位の差し替えおよび前置、後置のためのコンフィグ処理)
public void LoadReplaceFile(string filename)
{
EraStreamReader eReader = new EraStreamReader(false);
if (!eReader.Open(filename))
return;
ScriptPosition pos = null;
try
{
string line = null;
while ((line = eReader.ReadLine()) != null)
{
if ((line.Length == 0) || (line[0] == ';'))
continue;
pos = new ScriptPosition(eReader.Filename, eReader.LineNo, line);
string[] tokens = line.Split(',', ':');
if (tokens.Length < 2)
continue;
string itemName = tokens[0].Trim();
tokens[1] = line.Substring(tokens[0].Length + 1);
if (string.IsNullOrEmpty(tokens[1].Trim()))
continue;
AConfigItem item = GetReplaceItem(itemName);
if (item != null)
item.TryParse(tokens[1]);
}
}
catch (EmueraException ee)
{
ParserMediator.Warn(ee.Message, pos, 1);
}
catch (Exception exc)
{
ParserMediator.Warn(exc.GetType() + ":" + exc.Message, pos, 1, exc.StackTrace);
}
finally { eReader.Dispose(); }
}
#endregion
#region debug
public bool SaveDebugConfig()
{
StreamWriter writer = null;
try
{
writer = new StreamWriter(configdebugPath, false, Config.Encode);
for (int i = 0; i < debugArray.Length; i++)
{
AConfigItem item = debugArray[i];
if (item == null)
continue;
writer.WriteLine(item.ToString());
}
}
catch (Exception)
{
return false;
}
finally
{
if (writer != null)
writer.Close();
}
return true;
}
public bool LoadDebugConfig()
{
if (!File.Exists(configdebugPath))
goto err;
EraStreamReader eReader = new EraStreamReader(false);
if (!eReader.Open(configdebugPath))
goto err;
ScriptPosition pos = null;
try
{
string line = null;
while ((line = eReader.ReadLine()) != null)
{
if ((line.Length == 0) || (line[0] == ';'))
continue;
pos = new ScriptPosition(eReader.Filename, eReader.LineNo, line);
string[] tokens = line.Split(':');
if (tokens.Length < 2)
continue;
AConfigItem item = GetDebugItem(tokens[0].Trim());
if (item != null)
{
item.TryParse(tokens[1]);
}
#if DEBUG
//else
// throw new Exception("コンフィグファイルが変");
#endif
}
}
catch (EmueraException ee)
{
ParserMediator.ConfigWarn(ee.Message, pos, 1, null);
goto err;
}
catch (Exception exc)
{
ParserMediator.ConfigWarn(exc.GetType() + ":" + exc.Message, pos, 1, exc.StackTrace);
goto err;
}
finally { eReader.Dispose(); }
Config.SetDebugConfig(this);
return true;
err:
Config.SetDebugConfig(this);
return false;
}
#endregion
}
}