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.

CommonSkill.cs 9.5 kB

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