using CommonLang;
using CommonLang.IO;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.IO;
using XmdsCommonServer.XLS.Data;
namespace XmdsCommonServer.XLS
{
///
/// 怪物数据加载.
///
public class XLSMonsterDataLoader : XLSLoader
{
public const string ANYINGMO_SHEET_NAME = "Anyingmo";
public const string DUNGEONNORMAL = "Dungeon-Normal";
public const string DUNGEONELITE = "Dungeon-Elite";
public const string DUNGEONHERO = "Dungeon-Hero";
public const int DUNGEONELITE_VALUE = 10000;
public const int DUNGEONHERO_VALUE = 20000;
private HashMap> mSceneData = new HashMap>();
public XLSMonsterDataLoader(string path)
{
byte[] data = Resource.LoadData(path);
if (data == null)
{
throw new Exception("Can not read xls file : " + path);
}
using (MemoryStream ms = new MemoryStream(data))
{
IWorkbook Workbook = null;
if (path.Contains(".xlsx"))
{
Workbook = new XSSFWorkbook(ms);
}
else if (path.Contains(".xls"))
{
Workbook = new HSSFWorkbook(ms);
}
for (int si = 0; si < Workbook.NumberOfSheets; si++)
{
ISheet sheet = Workbook.GetSheetAt(si) as ISheet;
try
{
if (sheet.SheetName != "Remark" && !sheet.SheetName.Contains("("))
{
LoadSheet(sheet);
}
}
catch (Exception error)
{
log.Error("------表格加载异常 - " + path + ", 异常信息:" + error.ToString());
}
}
}
log.Info("XLSMonsterDataLoader 初始化怪物配置完成.");
}
private void LoadSheet(ISheet sheet)
{
HashMap data = new HashMap();
mSceneData.Add(sheet.SheetName, data);
bool needformatkey = sheet.SheetName == ANYINGMO_SHEET_NAME ? true : false;
string name = null;
int index = 0;
MonsterData temp = null;
Random random = new Random();
foreach (MonsterData m in LoadSheet(sheet))
{
if (needformatkey)
{
name = string.Format("{0}_{1}", m.ID, m.Level);
}
else
{
name = m.ID.ToString();
}
m.InitData(random);
temp = m;
data.Add(name, m);
index++;
}
log.Info(string.Format("loadSheet【{0}】Complete", sheet.SheetName));
}
public MonsterData GetMonsterAbility(string sceneType, int unit_template_id, Random random, bool needFormat = true)
{
MonsterData ret = null;
HashMap data = null;
if (mSceneData.TryGetValue(sceneType, out data))
{
//data.TryGetValue(string.Format("{0}_{1}", id, unit_level), out ret);
if (needFormat)
{
//特殊副本按照规则查询.
switch (sceneType)
{
case DUNGEONELITE:
unit_template_id += DUNGEONELITE_VALUE;
break;
case DUNGEONHERO:
unit_template_id += DUNGEONHERO_VALUE;
break;
default: break;
}
}
int id = unit_template_id;
data.TryGetValue(id.ToString(), out ret);
if (ret != null && random != null)
{
id = ret.GetRandomID(id, random);
//怪物能力变异生效,重新获取能力.
if (id != unit_template_id)
{
ret = null;
//data.TryGetValue(string.Format("{0}_{1}", id, unit_level), out ret);
data.TryGetValue(id.ToString(), out ret);
}
}
if (ret == null)
{
log.Error(string.Format("XLSLoader GetMonsterAbility Error:sceneType = {0} id = {1} ", sceneType, id));
}
}
return ret;
}
public MonsterData GetSummonMonsterAbility(string sceneType, int unit_template_id, int unit_level, Random random)
{
MonsterData ret = null;
HashMap data = null;
if (mSceneData.TryGetValue(sceneType, out data))
{
int id = unit_template_id;
data.TryGetValue(string.Format("{0}_{1}", id, unit_level), out ret);
if (ret == null)
{
log.Error(string.Format("XLSLoader GetMonsterAbility Error:sceneType = {0} id = {1} level = {2}", sceneType, id, unit_level));
}
}
return ret;
}
}
}