| @@ -15,9 +15,13 @@ namespace GameClass.GameObj | |||
| public override int AP => GameData.basicApOfGhost; | |||
| public override int Speed => GameData.basicBulletMoveSpeed; | |||
| public override bool IsToBomb => false; | |||
| public override int CastTime => GameData.basicCastTime; | |||
| public override int Backswing => GameData.basicBackswing; | |||
| public override int RecoveryFromHit => GameData.basicRecoveryFromHit; | |||
| public const int cd = GameData.basicBackswing; | |||
| public override int CD => cd; | |||
| public override bool CanAttack(GameObj target) | |||
| { | |||
| return false; | |||
| @@ -41,9 +45,13 @@ namespace GameClass.GameObj | |||
| public override int AP => GameData.basicApOfGhost / 5 * 4; | |||
| public override int Speed => GameData.basicBulletMoveSpeed * 2; | |||
| public override bool IsToBomb => false; | |||
| public override int CastTime => GameData.basicCastTime; | |||
| public override int Backswing => GameData.basicBackswing / 5 * 3; | |||
| public override int RecoveryFromHit => GameData.basicRecoveryFromHit / 4 * 3; | |||
| public override int Backswing => GameData.basicBackswing / 5 * 2; | |||
| public override int RecoveryFromHit => GameData.basicBackswing / 4 * 3; | |||
| public const int cd = GameData.basicBackswing / 5 * 2 + 100; | |||
| public override int CD => cd; | |||
| public override bool CanAttack(GameObj target) | |||
| { | |||
| return false; | |||
| @@ -68,9 +76,13 @@ namespace GameClass.GameObj | |||
| public override double BulletAttackRange => GameData.basicAttackShortRange / 9 * 7; | |||
| public override int AP => GameData.basicApOfGhost / 3 * 7; | |||
| public override int Speed => GameData.basicBulletMoveSpeed / 3 * 2; | |||
| public override int CastTime => GameData.basicCastTime; | |||
| public override int Backswing => GameData.basicBackswing; | |||
| public override int RecoveryFromHit => GameData.basicRecoveryFromHit; | |||
| public const int cd = GameData.basicCD; | |||
| public override int CD => cd; | |||
| public override bool IsToBomb => true; | |||
| public override bool CanAttack(GameObj target) | |||
| { | |||
| @@ -97,9 +109,13 @@ namespace GameClass.GameObj | |||
| public override double BulletAttackRange => GameData.basicAttackShortRange / 2; | |||
| public override int AP => GameData.basicApOfGhost / 6 * 5; | |||
| public override int Speed => GameData.basicBulletMoveSpeed / 6 * 5; | |||
| public override int CastTime => GameData.basicCastTime; | |||
| public override int Backswing => GameData.basicBackswing; | |||
| public override int RecoveryFromHit => GameData.basicRecoveryFromHit; | |||
| public const int cd = GameData.basicCD; | |||
| public override int CD => cd; | |||
| public override bool IsToBomb => true; | |||
| public override bool CanAttack(GameObj target) | |||
| { | |||
| @@ -128,6 +144,8 @@ namespace GameClass.GameObj | |||
| public override int CastTime => GameData.basicCastTime; | |||
| public override int Backswing => GameData.basicBackswing; | |||
| public override int RecoveryFromHit => GameData.basicRecoveryFromHit; | |||
| public const int cd = GameData.basicCD; | |||
| public override int CD => cd; | |||
| public override bool IsToBomb => true; | |||
| public override bool CanAttack(GameObj target) | |||
| @@ -157,6 +175,8 @@ namespace GameClass.GameObj | |||
| public override int CastTime => GameData.basicCastTime; | |||
| public override int Backswing => GameData.basicBackswing; | |||
| public override int RecoveryFromHit => GameData.basicRecoveryFromHit; | |||
| public const int cd = GameData.basicCD; | |||
| public override int CD => cd; | |||
| public override bool IsToBomb => true; | |||
| public override bool CanBeBombed(GameObjType gameObjType) | |||
| @@ -17,6 +17,7 @@ namespace GameClass.GameObj | |||
| public abstract int CastTime { get; } | |||
| public abstract int Backswing { get; } | |||
| public abstract int RecoveryFromHit { get; } | |||
| public abstract int CD { get; } | |||
| private readonly bool hasSpear; | |||
| /// <summary> | |||
| @@ -56,25 +57,23 @@ namespace GameClass.GameObj | |||
| { | |||
| public static Bullet? GetBullet(Character character, PlaceType place, XY pos) | |||
| { | |||
| Bullet? newBullet = null; | |||
| switch (character.BulletOfPlayer) | |||
| { | |||
| case BulletType.FlyingKnife: | |||
| return new FlyingKnife(character, place, pos); | |||
| case BulletType.CommonAttackOfGhost: | |||
| return new CommonAttackOfGhost(character, place, pos); | |||
| case BulletType.AtomBomb: | |||
| newBullet = new AtomBomb(character, place, pos); | |||
| break; | |||
| return new AtomBomb(character, place, pos); | |||
| case BulletType.LineBullet: | |||
| newBullet = new LineBullet(character, place, pos); | |||
| break; | |||
| return new LineBullet(character, place, pos); | |||
| case BulletType.FastBullet: | |||
| newBullet = new FastBullet(character, place, pos); | |||
| break; | |||
| return new FastBullet(character, place, pos); | |||
| case BulletType.OrdinaryBullet: | |||
| newBullet = new OrdinaryBullet(character, place, pos); | |||
| break; | |||
| return new OrdinaryBullet(character, place, pos); | |||
| default: | |||
| break; | |||
| return null; | |||
| } | |||
| return newBullet; | |||
| } | |||
| public static int BulletRadius(BulletType bulletType) | |||
| { | |||
| @@ -84,9 +83,26 @@ namespace GameClass.GameObj | |||
| case BulletType.LineBullet: | |||
| case BulletType.FastBullet: | |||
| case BulletType.OrdinaryBullet: | |||
| case BulletType.FlyingKnife: | |||
| default: | |||
| return GameData.bulletRadius; | |||
| } | |||
| } | |||
| public static int BulletCD(BulletType bulletType) | |||
| { | |||
| switch (bulletType) | |||
| { | |||
| case BulletType.CommonAttackOfGhost: | |||
| return CommonAttackOfGhost.cd; | |||
| case BulletType.FlyingKnife: | |||
| return FlyingKnife.cd; | |||
| case BulletType.AtomBomb: | |||
| case BulletType.LineBullet: | |||
| case BulletType.FastBullet: | |||
| case BulletType.OrdinaryBullet: | |||
| default: | |||
| return GameData.basicCD; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -77,7 +77,7 @@ namespace GameClass.GameObj | |||
| this.hp = Occupation.MaxHp; | |||
| this.OrgMoveSpeed = Occupation.MoveSpeed; | |||
| this.moveSpeed = Occupation.MoveSpeed; | |||
| this.cd = Occupation.CD; | |||
| this.OrgCD = this.cd = BulletFactory.BulletCD(Occupation.InitBullet); | |||
| this.maxBulletNum = Occupation.MaxBulletNum; | |||
| this.bulletNum = maxBulletNum; | |||
| this.bulletOfPlayer = Occupation.InitBullet; | |||
| @@ -45,7 +45,10 @@ namespace GameClass.GameObj | |||
| set | |||
| { | |||
| lock (gameObjLock) | |||
| { | |||
| bulletOfPlayer = value; | |||
| CD = BulletFactory.BulletCD(value); | |||
| } | |||
| } | |||
| } | |||
| @@ -54,7 +54,7 @@ namespace Gaming | |||
| () => | |||
| { | |||
| while (!gameMap.Timer.IsGaming) | |||
| Thread.Sleep(newPlayer.CD); | |||
| Thread.Sleep(Math.Max(newPlayer.CD, GameData.checkInterval)); | |||
| long lastTime = Environment.TickCount64; | |||
| new FrameRateTaskExecutor<int>( | |||
| loopCondition: () => gameMap.Timer.IsGaming && !newPlayer.IsResetting, | |||
| @@ -63,7 +63,7 @@ namespace Gaming | |||
| long nowTime = Environment.TickCount64; | |||
| if (newPlayer.BulletNum == newPlayer.MaxBulletNum) | |||
| lastTime = nowTime; | |||
| if (nowTime - lastTime >= newPlayer.CD) | |||
| else if (nowTime - lastTime >= newPlayer.CD) | |||
| { | |||
| _ = newPlayer.TryAddBulletNum(); | |||
| lastTime = nowTime; | |||
| @@ -91,7 +91,7 @@ namespace Gaming | |||
| () => | |||
| { | |||
| while (!gameMap.Timer.IsGaming) | |||
| Thread.Sleep((int)GameData.checkInterval); | |||
| Thread.Sleep(GameData.checkInterval); | |||
| int TimePinningDown = 0, ScoreAdded = 0; | |||
| new FrameRateTaskExecutor<int>( | |||
| loopCondition: () => gameMap.Timer.IsGaming && !newPlayer.IsResetting, | |||
| @@ -124,7 +124,7 @@ namespace Gaming | |||
| newPlayer.AddBgm(BgmType.GhostIsComing, (double)newPlayer.AlertnessRadius / XY.Distance(newPlayer.Position, person.Position)); | |||
| if (XY.Distance(newPlayer.Position, person.Position) <= GameData.basicViewRange) | |||
| { | |||
| TimePinningDown += (int)GameData.checkInterval; | |||
| TimePinningDown += GameData.checkInterval; | |||
| newPlayer.AddScore(GameData.StudentScorePinDown(TimePinningDown) - ScoreAdded); | |||
| ScoreAdded = GameData.StudentScorePinDown(TimePinningDown); | |||
| } | |||
| @@ -8,7 +8,6 @@ namespace Preparation.Interface | |||
| public int MoveSpeed { get; } | |||
| public int MaxHp { get; } | |||
| public BulletType InitBullet { get; } | |||
| public int CD { get; } | |||
| public int MaxBulletNum { get; } | |||
| public List<ActiveSkillType> ListOfIActiveSkill { get; } | |||
| public List<PassiveSkillType> ListOfIPassiveSkill { get; } | |||
| @@ -38,9 +37,6 @@ namespace Preparation.Interface | |||
| private const int maxHp = GameData.basicHp; | |||
| public int MaxHp => maxHp; | |||
| public const int cd = 0; | |||
| public int CD => cd; | |||
| public const int maxBulletNum = 1; | |||
| public int MaxBulletNum => maxBulletNum; | |||
| @@ -69,15 +65,12 @@ namespace Preparation.Interface | |||
| } | |||
| public class Teacher : IStudent | |||
| { | |||
| private const int moveSpeed = GameData.basicMoveSpeed / 38 * 40; | |||
| private const int moveSpeed = GameData.basicMoveSpeed / 42 * 36; | |||
| public int MoveSpeed => moveSpeed; | |||
| private const int maxHp = GameData.basicHp / 30 * 32; | |||
| private const int maxHp = GameData.basicHp * 10; | |||
| public int MaxHp => maxHp; | |||
| public const int cd = 0; | |||
| public int CD => cd; | |||
| public const int maxBulletNum = 0; | |||
| public int MaxBulletNum => maxBulletNum; | |||
| @@ -118,9 +111,6 @@ namespace Preparation.Interface | |||
| private const int maxHp = GameData.basicHp / 30 * 32; | |||
| public int MaxHp => maxHp; | |||
| public const int cd = 0; | |||
| public int CD => cd; | |||
| public const int maxBulletNum = 0; | |||
| public int MaxBulletNum => maxBulletNum; | |||
| @@ -8,7 +8,7 @@ namespace Preparation.Utility | |||
| #region 基本常数 | |||
| public const int numOfStepPerSecond = 20; // 每秒行走的步数 | |||
| public const int frameDuration = 50; // 每帧时长 | |||
| public const long checkInterval = 50; // 检查位置标志、补充子弹的帧时长 | |||
| public const int checkInterval = 50; // 检查位置标志、补充子弹的帧时长 | |||
| public const long gameDuration = 600000; // 游戏时长600000ms = 10min | |||