Monster.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. using CommonAI.Data;
  2. using CommonLang;
  3. using System;
  4. using System.Collections.Generic;
  5. namespace XmdsCommonServer.XLS.Data
  6. {
  7. public class MonsterData
  8. {
  9. /// <summary>
  10. /// 怪物编号.
  11. /// </summary>
  12. public int ID;
  13. /// <summary>
  14. /// 怪物名字.
  15. /// </summary>
  16. public string Name;
  17. /// <summary>
  18. /// 副本名字、称号:怪物的称号,跟随在怪物名字之前或者之后比如:死亡骑士阿尔萨斯.
  19. /// </summary>
  20. public string Title;
  21. /// <summary>
  22. /// 生物类型.0:人类1:野兽2:不死生物3:恶魔9:其他.
  23. /// </summary>
  24. public byte Atype;
  25. /// <summary>
  26. /// 性别.
  27. /// </summary>
  28. public byte Sex;
  29. /// <summary>
  30. /// 等级.
  31. /// </summary>
  32. public int Level;
  33. /// <summary>
  34. /// 名字颜色.
  35. /// </summary>
  36. public byte Qcolor;
  37. /// <summary>
  38. /// 怪物类型.BOSS、精英、普通.
  39. /// </summary>
  40. public byte Type;
  41. /// <summary>
  42. /// 1等级压制 0或空不压制
  43. /// </summary>
  44. public byte LvRepress;
  45. /// <summary>
  46. /// 技能类型
  47. /// </summary>
  48. public int SkillType;
  49. /// <summary>
  50. /// 战斗数值规模
  51. /// </summary>
  52. public byte Fight_Type;
  53. /// <summary>
  54. /// 玩家围攻数量
  55. /// </summary>
  56. public float Fight_Count;
  57. /// <summary>
  58. /// 存活时间
  59. /// </summary>
  60. public float AliveTime;
  61. /// <summary>
  62. /// 致死玩家时间
  63. /// </summary>
  64. public float KillPlayerTime;
  65. /// <summary>
  66. /// 变成普通怪概率.
  67. /// </summary>
  68. public int Prob1;
  69. /// <summary>
  70. /// 普通怪ID.
  71. /// </summary>
  72. public int ReviveID1;
  73. /// <summary>
  74. /// 变成稀有怪概率.
  75. /// </summary>
  76. public int Prob2;
  77. /// <summary>
  78. /// 稀有怪ID.
  79. /// </summary>
  80. public int ReviveID2;
  81. /// <summary>
  82. /// 首脑怪概率.
  83. /// </summary>
  84. public int Prob3;
  85. /// <summary>
  86. /// 首脑怪ID.
  87. /// </summary>
  88. public int ReviveID3;
  89. /// <summary>
  90. /// 变成精英怪物的概率.
  91. /// </summary>
  92. public int Prob4;
  93. /// <summary>
  94. /// 精英怪物ID.
  95. /// </summary>
  96. public int ReviveID4;
  97. /// <summary>
  98. /// 显示个性语言概率.
  99. /// </summary>
  100. public int DialogChance;
  101. /// <summary>
  102. /// 个性语言内容.
  103. /// </summary>
  104. public string DialogWords;
  105. /// <summary>
  106. /// 显示死亡个性语言概率.
  107. /// </summary>
  108. public int DeadDialogChance;
  109. /// <summary>
  110. /// 死亡个性语言内容.
  111. /// </summary>
  112. public string DeadDialogWords;
  113. /// <summary>
  114. /// 生命.
  115. /// </summary>
  116. public int MaxHP;
  117. /// <summary>
  118. /// 攻击.
  119. /// </summary>
  120. public int MaxAttack;
  121. /// <summary>
  122. /// 防御.
  123. /// </summary>
  124. public int MaxDefence;
  125. /// <summary>
  126. /// 暴击.
  127. /// </summary>
  128. public int CritRate;
  129. /// <summary>
  130. /// 暴击伤害
  131. /// </summary>
  132. public int CritDamage;
  133. /// <summary>
  134. /// 抗暴.
  135. /// </summary>
  136. public int ResCrit;
  137. /// <summary>
  138. /// 抗暴.
  139. /// </summary>
  140. public int Resist;
  141. /// <summary>
  142. /// 无视敌人防御%
  143. /// </summary>
  144. public int IgnoreDefencePer;
  145. /// <summary>
  146. /// 是否主动攻击.0否,1是.
  147. /// </summary>
  148. public byte isAttack;
  149. /// <summary>
  150. /// 特殊能力.
  151. /// </summary>
  152. public string Ability;
  153. /// <summary>
  154. /// 触发百分比.
  155. /// </summary>
  156. public string CallAbilityPerHP;
  157. /// <summary>
  158. /// 盾血量.
  159. /// </summary>
  160. public string AbilityPar;
  161. /// <summary>
  162. /// 特殊能力脚本ID.
  163. /// </summary>
  164. public List<int> AbilityList = null;
  165. /// <summary>
  166. /// 血量触发百分比.
  167. /// </summary>
  168. public List<int> AbilityPerHPList = null;
  169. /// <summary>
  170. /// 血量触发的护盾值.
  171. /// </summary>
  172. public List<int> AbilityParList = null;
  173. /// <summary>
  174. /// 是否是共享怪.
  175. /// </summary>
  176. public int ShareType = 0;
  177. /** 定力值 */
  178. public int MPValue = 0;
  179. // 怪物类型-针对于宠物的天命类型
  180. public UnitFateType FateType = UnitFateType.None;
  181. public int GetRandomID(int srcID, Random random)
  182. {
  183. int ret = 0;
  184. int rt = 0;
  185. if (Prob1 == 0) { ret = srcID; }
  186. else
  187. {
  188. int sum = Prob1 + Prob2 + Prob3 + Prob4;
  189. if (sum < 10000)
  190. {
  191. XLSLoader.log.Log("Monster ID = [" + srcID + "] RandomRate Error");
  192. }
  193. int a = Prob1;
  194. int b = a + Prob2;
  195. int c = b + Prob3;
  196. int d = c + Prob4;
  197. rt = random.Next(0, 10000);
  198. if (c != d && IsInRange(rt, c, d))
  199. {
  200. ret = GetProbValue(Prob4);
  201. }
  202. else if (b != c && IsInRange(rt, b, c))
  203. {
  204. ret = GetProbValue(Prob3);
  205. }
  206. else if (a != b && IsInRange(rt, a, b))
  207. {
  208. ret = GetProbValue(Prob2);
  209. }
  210. else if (0 != a && IsInRange(rt, 0, a))
  211. {
  212. ret = GetProbValue(Prob1);
  213. }
  214. }
  215. return ret;
  216. }
  217. /// <summary>
  218. /// 是否在范围内[a,b).
  219. /// </summary>
  220. /// <param name="value"></param>
  221. /// <param name="min"></param>
  222. /// <param name="max"></param>
  223. /// <returns></returns>
  224. private static bool IsInRange(int value, int min, int max)
  225. {
  226. return value >= min && value < max;
  227. }
  228. private int GetProbValue(int prob)
  229. {
  230. int ret = 0;
  231. if (prob == Prob1) { ret = ReviveID1; }
  232. else if (prob == Prob2) { ret = ReviveID2; }
  233. else if (prob == Prob3) { ret = ReviveID3; }
  234. else if (prob == Prob4) { ret = ReviveID4; }
  235. return ret;
  236. }
  237. public void InitData(Random random)
  238. {
  239. //解析能力字段.
  240. //数据格式:"999000;999001".
  241. if (!string.IsNullOrEmpty(Ability))
  242. {
  243. AbilityList = new List<int>();
  244. string[] strArray = Ability.Split(';');
  245. if (strArray != null && strArray.Length > 0)
  246. {
  247. for (int i = 0; i < strArray.Length; i++)
  248. {
  249. ParseStrAddList(ref AbilityList, strArray[i]);
  250. }
  251. }
  252. //7000|3000;
  253. if (!string.IsNullOrEmpty(CallAbilityPerHP))
  254. {
  255. AbilityPerHPList = new List<int>();
  256. strArray = CallAbilityPerHP.Split('|');
  257. if (strArray != null && strArray.Length > 0)
  258. {
  259. for (int i = 0; i < strArray.Length; i++)
  260. {
  261. ParseStrAddList(ref AbilityPerHPList, strArray[i]);
  262. }
  263. }
  264. }
  265. if (!string.IsNullOrEmpty(AbilityPar))
  266. {
  267. AbilityParList = new List<int>();
  268. strArray = AbilityPar.Split('|');
  269. if (strArray != null && strArray.Length > 0)
  270. {
  271. for (int i = 0; i < strArray.Length; i++)
  272. {
  273. ParseStrAddList(ref AbilityParList, strArray[i]);
  274. }
  275. }
  276. }
  277. if (AbilityParList != null && AbilityPerHPList != null)
  278. {
  279. if(AbilityPerHPList.Count != AbilityParList.Count )
  280. {
  281. throw new Exception("Ability ParseError");
  282. }
  283. }
  284. }
  285. }
  286. private void ParseStrAddList(ref List<int> list, string content)
  287. {
  288. int v = 0;
  289. if (Int32.TryParse(content, out v))
  290. {
  291. list.Add(v);
  292. }
  293. }
  294. }
  295. }