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 11 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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 Gaming
  8. {
  9. public partial class Game
  10. {
  11. private partial class SkillManager
  12. {
  13. public interface IActiveSkill
  14. {
  15. public int SkillCD { get; }
  16. public int DurationTime { get; } //技能持续时间
  17. public object ActiveSkillLock { get; }
  18. public bool SkillEffect(Character player);
  19. }
  20. public class BecomeVampire : IActiveSkill // 化身吸血鬼
  21. {
  22. public int SkillCD => GameData.commonSkillCD / 3 * 4;
  23. public int DurationTime => GameData.commonSkillTime;
  24. private readonly object commonSkillLock = new object();
  25. public object ActiveSkillLock => commonSkillLock;
  26. public bool SkillEffect(Character player)
  27. {
  28. return ActiveSkillEffect(this, player, () =>
  29. {
  30. player.Vampire += 0.5;
  31. Debugger.Output(player, "becomes vampire!");
  32. },
  33. () =>
  34. {
  35. double tempVam = player.Vampire - 0.5;
  36. player.Vampire = tempVam < player.OriVampire ? player.OriVampire : tempVam;
  37. });
  38. }
  39. }
  40. private IActiveSkill becomeVampire = new BecomeVampire();
  41. public class BeginToCharge : IActiveSkill
  42. {
  43. public int SkillCD => GameData.commonSkillCD / 3 * 4;
  44. public int DurationTime => GameData.commonSkillTime;
  45. private readonly object commonSkillLock = new object();
  46. public object ActiveSkillLock => commonSkillLock;
  47. public bool SkillEffect(Character player)
  48. {
  49. return ActiveSkillEffect(this, player, () =>
  50. {
  51. player.Vampire += 0.5;
  52. Debugger.Output(player, "becomes vampire!");
  53. },
  54. () =>
  55. {
  56. double tempVam = player.Vampire - 0.5;
  57. player.Vampire = tempVam < player.OriVampire ? player.OriVampire : tempVam;
  58. });
  59. }
  60. }
  61. private IActiveSkill beginToCharge = new BeginToCharge();
  62. public class BecomeInvisible : IActiveSkill
  63. {
  64. public int SkillCD => GameData.commonSkillCD;
  65. public int DurationTime => GameData.commonSkillTime / 10 * 6;
  66. private readonly object commonSkillLock = new object();
  67. public object ActiveSkillLock => commonSkillLock;
  68. public bool SkillEffect(Character player)
  69. {
  70. return ActiveSkillEffect(this, player, () =>
  71. {
  72. player.IsInvisible = true;
  73. Debugger.Output(player, "become invisible!");
  74. },
  75. () =>
  76. { player.IsInvisible = false; });
  77. }
  78. }
  79. private IActiveSkill becomeInvisible = new BecomeInvisible();
  80. public class NuclearWeapon : IActiveSkill // 核武器
  81. {
  82. public int SkillCD => GameData.commonSkillCD / 3 * 7;
  83. public int DurationTime => GameData.commonSkillTime / 10;
  84. private readonly object commonSkillLock = new object();
  85. public object ActiveSkillLock => commonSkillLock;
  86. public bool SkillEffect(Character player)
  87. {
  88. return ActiveSkillEffect(this, player, () =>
  89. {
  90. player.BulletOfPlayer = BulletType.AtomBomb;
  91. Debugger.Output(player, "uses atombomb!");
  92. },
  93. () =>
  94. { player.BulletOfPlayer = player.OriBulletOfPlayer; });
  95. }
  96. }
  97. private IActiveSkill nuclearWeapon = new NuclearWeapon();
  98. public class UseKnife : IActiveSkill
  99. {
  100. public int SkillCD => GameData.commonSkillCD / 3 * 2;
  101. public int DurationTime => GameData.commonSkillTime / 10;
  102. private readonly object commonSkillLock = new object();
  103. public object ActiveSkillLock => commonSkillLock;
  104. public bool SkillEffect(Character player)
  105. {
  106. return ActiveSkillEffect(this, player, () =>
  107. {
  108. player.BulletOfPlayer = BulletType.FlyingKnife;
  109. Debugger.Output(player, "uses flyingknife!");
  110. },
  111. () =>
  112. { player.BulletOfPlayer = player.OriBulletOfPlayer; });
  113. }
  114. }
  115. private IActiveSkill useKnife = new UseKnife();
  116. public class SuperFast : IActiveSkill // 3倍速
  117. {
  118. public int SkillCD => GameData.commonSkillCD;
  119. public int DurationTime => GameData.commonSkillTime / 10 * 4;
  120. private readonly object commonSkillLock = new object();
  121. public object ActiveSkillLock => commonSkillLock;
  122. public bool SkillEffect(Character player)
  123. {
  124. return ActiveSkillEffect(this, player, () =>
  125. {
  126. player.AddMoveSpeed(this.DurationTime, 3.0);
  127. Debugger.Output(player, "moves very fast!");
  128. },
  129. () =>
  130. { });
  131. }
  132. }
  133. private IActiveSkill superFast = new SuperFast();
  134. public IActiveSkill? FindIActiveSkill(ActiveSkillType activeSkillType)
  135. {
  136. switch (activeSkillType)
  137. {
  138. case ActiveSkillType.BecomeInvisible:
  139. return this.becomeInvisible;
  140. default:
  141. return null;
  142. }
  143. }
  144. public static ActiveSkillType FindActiveSkillType(IActiveSkill ActiveSkill)
  145. {
  146. switch (ActiveSkill)
  147. {
  148. case BecomeInvisible:
  149. return ActiveSkillType.BecomeInvisible;
  150. case UseKnife:
  151. return ActiveSkillType.UseKnife;
  152. case BeginToCharge:
  153. return ActiveSkillType.BeginToCharge;
  154. default:
  155. return ActiveSkillType.Null;
  156. }
  157. }
  158. public static bool ActiveSkillEffect(IActiveSkill activeSkill, Character player, Action startSkill, Action endSkill)
  159. {
  160. lock (activeSkill.ActiveSkillLock)
  161. {
  162. ActiveSkillType activeSkillType = FindActiveSkillType(activeSkill);
  163. if (player.TimeUntilActiveSkillAvailable[activeSkillType] == 0)
  164. {
  165. player.SetTimeUntilActiveSkillAvailable(activeSkillType, activeSkill.SkillCD);
  166. new Thread
  167. (() =>
  168. {
  169. startSkill();
  170. new FrameRateTaskExecutor<int>(
  171. () => !player.IsResetting,
  172. () =>
  173. {
  174. player.AddTimeUntilActiveSkillAvailable(activeSkillType, -(int)GameData.frameDuration);
  175. },
  176. timeInterval: GameData.frameDuration,
  177. () => 0,
  178. maxTotalDuration: (long)(activeSkill.DurationTime)
  179. )
  180. {
  181. AllowTimeExceed = true,
  182. MaxTolerantTimeExceedCount = ulong.MaxValue,
  183. }
  184. .Start();
  185. endSkill();
  186. Debugger.Output(player, "return to normal.");
  187. new FrameRateTaskExecutor<int>(
  188. () => player.TimeUntilActiveSkillAvailable[activeSkillType] > 0 && !player.IsResetting,
  189. () =>
  190. {
  191. player.AddTimeUntilActiveSkillAvailable(activeSkillType, -(int)GameData.frameDuration);
  192. },
  193. timeInterval: GameData.frameDuration,
  194. () => 0,
  195. maxTotalDuration: (long)(activeSkill.SkillCD - activeSkill.DurationTime)
  196. )
  197. {
  198. AllowTimeExceed = true,
  199. MaxTolerantTimeExceedCount = ulong.MaxValue,
  200. }
  201. .Start();
  202. player.SetTimeUntilActiveSkillAvailable(activeSkillType, 0);
  203. Debugger.Output(player, "ActiveSkill is ready.");
  204. }
  205. )
  206. { IsBackground = true }.Start();
  207. return true;
  208. }
  209. else
  210. {
  211. Debugger.Output(player, "CommonSkill is cooling down!");
  212. return false;
  213. }
  214. }
  215. }
  216. }
  217. }
  218. }