JSGCardDataBase.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using CommonAI.data;
  2. using CommonAI.Data;
  3. using CommonLang.Log;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using XmdsCommonSkill.Plugin.CardSkill;
  10. namespace XmdsCommonServer.Plugin.Base
  11. {
  12. public abstract class JSGCardDataBase : ICardData
  13. {
  14. protected static Logger log = LoggerFactory.GetLogger("JSGCardDataBase");
  15. public static readonly byte TRIGGER_NUM = 4;
  16. protected int mCards = 0;
  17. protected CardType[] mCardData = new CardType[(int)CardType.Max];
  18. public virtual void RefreshCardInfo(XmdsVirtual unit) { }
  19. public virtual void RefreshCardInfo(XmdsVirtual unit, byte[] cardData) { }
  20. public virtual void SendTriggerInfo(XmdsVirtual player, CardTriggerResult result, int skillId, byte[] cardData) { }
  21. public int GetCardNums()
  22. {
  23. return this.mCards;
  24. }
  25. public void ReSet(XmdsVirtual unit)
  26. {
  27. this.mCards = 0;
  28. for (int i = 0; i < (int)CardType.Max; i++)
  29. {
  30. mCardData[i] = CardType.Max;
  31. }
  32. if (unit != null)
  33. {
  34. this.RefreshCardInfo(unit);
  35. }
  36. }
  37. public CardTriggerResult AddCard(XmdsVirtual unit, GenCardData cardData)
  38. {
  39. if (mCards + cardData.nums >= TRIGGER_NUM)
  40. {
  41. CardTriggerResult result = new CardTriggerResult();
  42. byte[] cardNum = new byte[(int)CardType.Max];
  43. for (int i = 0; i < mCards; i++)
  44. {
  45. cardNum[(int)mCardData[i]]++;
  46. result.cardData[i] = (byte)mCardData[i];
  47. }
  48. cardNum[(int)cardData.type] = (byte)(cardNum[(int)cardData.type] + (TRIGGER_NUM - mCards));
  49. //1. 触发结果
  50. byte sameMax = 0, sameIndex = 0;
  51. for (byte i = 0; i < (byte)CardType.Max; i++)
  52. {
  53. if (cardNum[i] > sameMax)
  54. {
  55. sameMax = cardNum[i];
  56. sameIndex = i;
  57. }
  58. }
  59. //2. 保存触发记录
  60. for(int i = mCards; i < TRIGGER_NUM; i++)
  61. {
  62. result.cardData[i] = (byte)cardData.type;
  63. }
  64. //填充剩余卡牌
  65. mCards = Math.Min(TRIGGER_NUM - 1, mCards + cardData.nums - TRIGGER_NUM);
  66. for (int i = 0; i < mCards; i++)
  67. {
  68. mCardData[i] = cardData.type;
  69. }
  70. result.type = sameMax <= 1 ? CardType.Max : (CardType)(sameIndex);
  71. result.sameNums = cardNum[sameIndex];
  72. if(result.sameNums < 1)
  73. {
  74. log.Warn("AddCard触发卡牌,sameNums异常:" + result.sameNums + ", type: " + result.type);
  75. log.Warn("详情:" + cardNum[0] + ", " + cardNum[1] + ", " + cardNum[2] + ", " + cardNum[3]);
  76. result.sameNums = 1;
  77. }
  78. //刷一次之前的球信息
  79. this.RefreshCardInfo(unit, result.cardData);
  80. //刷当前的数据
  81. this.RefreshCardInfo(unit);
  82. return result;
  83. }
  84. else
  85. {
  86. for (int i = mCards; i < mCards + cardData.nums; i++)
  87. {
  88. mCardData[i] = cardData.type;
  89. }
  90. mCards = mCards + cardData.nums;
  91. this.RefreshCardInfo(unit);
  92. return null;
  93. }
  94. }
  95. public CardType GetCardData(int index)
  96. {
  97. if(index < 0 || index >= mCards)
  98. {
  99. return CardType.Max;
  100. }
  101. return this.mCardData[index];
  102. }
  103. }
  104. }