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