You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ActiveSkill.cs 8.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. using GameClass.GameObj;
  2. using System.Threading;
  3. using Preparation.Interface;
  4. using Preparation.Utility;
  5. using System;
  6. using Timothy.FrameRateTask;
  7. namespace GameClass.Skill
  8. {
  9. public class BecomeVampire : IActiveSkill // 化身吸血鬼
  10. {
  11. private const int moveSpeed = GameData.basicMoveSpeed;
  12. public int MoveSpeed => moveSpeed;
  13. private const int maxHp = (int)(GameData.basicHp / 6 * 9.5);
  14. public int MaxHp => maxHp;
  15. // 以上参数以后再改
  16. public int SkillCD => GameData.commonSkillCD / 3 * 4;
  17. public int DurationTime => GameData.commonSkillTime;
  18. private readonly object commonSkillLock = new object();
  19. public object ActiveSkillLock => commonSkillLock;
  20. public bool SkillEffect(Character player)
  21. {
  22. return ActiveSkillFactory.SkillEffect(this, player, () =>
  23. {
  24. player.Vampire += 0.5;
  25. Debugger.Output(player, "becomes vampire!");
  26. },
  27. () =>
  28. {
  29. double tempVam = player.Vampire - 0.5;
  30. player.Vampire = tempVam < player.OriVampire ? player.OriVampire : tempVam;
  31. });
  32. }
  33. }
  34. public class BecomeInvisible : IActiveSkill
  35. {
  36. public int SkillCD => GameData.commonSkillCD;
  37. public int DurationTime => GameData.commonSkillTime / 10 * 6;
  38. private readonly object commonSkillLock = new object();
  39. public object ActiveSkillLock => commonSkillLock;
  40. public bool SkillEffect(Character player)
  41. {
  42. return ActiveSkillFactory.SkillEffect(this, player, () =>
  43. {
  44. player.IsInvisible = true;
  45. Debugger.Output(player, "uses atombomb!");
  46. },
  47. () =>
  48. { player.IsInvisible = false; });
  49. }
  50. }
  51. public class NuclearWeapon : IActiveSkill // 核武器
  52. {
  53. private const int moveSpeed = GameData.basicMoveSpeed / 3 * 4;
  54. public int MoveSpeed => moveSpeed;
  55. private const int maxHp = GameData.basicHp;
  56. public int MaxHp => maxHp;
  57. private const int maxBulletNum = GameData.basicBulletNum * 2 / 3;
  58. public int MaxBulletNum => maxBulletNum;
  59. // 以上参数以后再改
  60. public int SkillCD => GameData.commonSkillCD / 3 * 7;
  61. public int DurationTime => GameData.commonSkillTime / 10;
  62. private readonly object commonSkillLock = new object();
  63. public object ActiveSkillLock => commonSkillLock;
  64. public bool SkillEffect(Character player)
  65. {
  66. return ActiveSkillFactory.SkillEffect(this, player, () =>
  67. {
  68. player.BulletOfPlayer = BulletType.AtomBomb;
  69. Debugger.Output(player, "uses atombomb!");
  70. },
  71. () =>
  72. { player.BulletOfPlayer = player.OriBulletOfPlayer; });
  73. }
  74. }
  75. public class SuperFast : IActiveSkill // 3倍速
  76. {
  77. private const int moveSpeed = GameData.basicMoveSpeed * 4 / 3;
  78. public int MoveSpeed => moveSpeed;
  79. private const int maxHp = GameData.basicHp / 6 * 4;
  80. public int MaxHp => maxHp;
  81. private const int maxBulletNum = GameData.basicBulletNum * 4 / 3;
  82. public int MaxBulletNum => maxBulletNum;
  83. // 以上参数以后再改
  84. public int SkillCD => GameData.commonSkillCD;
  85. public int DurationTime => GameData.commonSkillTime / 10 * 4;
  86. private readonly object commonSkillLock = new object();
  87. public object ActiveSkillLock => commonSkillLock;
  88. public bool SkillEffect(Character player)
  89. {
  90. return ActiveSkillFactory.SkillEffect(this, player, () =>
  91. {
  92. player.AddMoveSpeed(this.DurationTime, 3.0);
  93. Debugger.Output(player, "moves very fast!");
  94. },
  95. () =>
  96. { });
  97. }
  98. }
  99. public class NoCommonSkill : IActiveSkill // 这种情况不该发生,定义着以防意外
  100. {
  101. private const int moveSpeed = GameData.basicMoveSpeed;
  102. public int MoveSpeed => moveSpeed;
  103. private const int maxHp = GameData.basicHp;
  104. public int MaxHp => maxHp;
  105. private const int maxBulletNum = GameData.basicBulletNum;
  106. public int MaxBulletNum => maxBulletNum;
  107. // 以上参数以后再改
  108. public int SkillCD => GameData.commonSkillCD;
  109. public int DurationTime => GameData.commonSkillTime;
  110. private readonly object commonSkillLock = new object();
  111. public object ActiveSkillLock => commonSkillLock;
  112. public bool SkillEffect(Character player)
  113. {
  114. return false;
  115. }
  116. }
  117. public static class ActiveSkillFactory
  118. {
  119. public static bool SkillEffect(IActiveSkill activeSkill, Character player, Action startSkill, Action endSkill)
  120. {
  121. lock (activeSkill.ActiveSkillLock)
  122. {
  123. if (player.TimeUntilCommonSkillAvailable == 0)
  124. {
  125. player.TimeUntilCommonSkillAvailable = activeSkill.SkillCD;
  126. new Thread
  127. (() =>
  128. {
  129. startSkill();
  130. new FrameRateTaskExecutor<int>(
  131. () => !player.IsResetting,
  132. () =>
  133. {
  134. player.TimeUntilCommonSkillAvailable -= (int)GameData.frameDuration;
  135. },
  136. timeInterval: GameData.frameDuration,
  137. () => 0,
  138. maxTotalDuration: (long)(activeSkill.DurationTime)
  139. )
  140. {
  141. AllowTimeExceed = true,
  142. MaxTolerantTimeExceedCount = ulong.MaxValue,
  143. }
  144. .Start();
  145. endSkill();
  146. Debugger.Output(player, "return to normal.");
  147. new FrameRateTaskExecutor<int>(
  148. () => player.TimeUntilCommonSkillAvailable > 0 && !player.IsResetting,
  149. () =>
  150. {
  151. player.TimeUntilCommonSkillAvailable -= (int)GameData.frameDuration;
  152. },
  153. timeInterval: GameData.frameDuration,
  154. () => 0,
  155. maxTotalDuration: (long)(activeSkill.SkillCD - activeSkill.DurationTime)
  156. )
  157. {
  158. AllowTimeExceed = true,
  159. MaxTolerantTimeExceedCount = ulong.MaxValue,
  160. }
  161. .Start();
  162. player.TimeUntilCommonSkillAvailable = 0;
  163. Debugger.Output(player, "CommonSkill is ready.");
  164. }
  165. )
  166. { IsBackground = true }.Start();
  167. return true;
  168. }
  169. else
  170. {
  171. Debugger.Output(player, "CommonSkill is cooling down!");
  172. return false;
  173. }
  174. }
  175. }
  176. }
  177. }