| @@ -42,14 +42,14 @@ namespace GameClass.GameObj | |||
| } | |||
| public override double BulletBombRange => 0; | |||
| public override double BulletAttackRange => GameData.basicRemoteAttackRange * 13; | |||
| public override int AP => GameData.basicApOfGhost / 5 * 4; | |||
| public override int AP => GameData.basicApOfGhost * 4 / 5; | |||
| 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 * 2; | |||
| public override int RecoveryFromHit => GameData.basicBackswing / 4 * 3; | |||
| public const int cd = GameData.basicBackswing / 5 * 2 + 100; | |||
| public override int Backswing => GameData.basicBackswing * 2 / 5; | |||
| public override int RecoveryFromHit => GameData.basicBackswing * 3 / 4; | |||
| public const int cd = GameData.basicBackswing * 2 / 5 + 100; | |||
| public override int CD => cd; | |||
| public override bool CanAttack(GameObj target) | |||
| @@ -72,10 +72,10 @@ namespace GameClass.GameObj | |||
| base(player, radius, placeType, pos) | |||
| { | |||
| } | |||
| public override double BulletBombRange => GameData.basicBulletBombRange / 3 * 7; | |||
| 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 double BulletBombRange => GameData.basicBulletBombRange * 7 / 3; | |||
| public override double BulletAttackRange => GameData.basicAttackShortRange * 7 / 9; | |||
| public override int AP => GameData.basicApOfGhost * 7 / 3; | |||
| public override int Speed => GameData.basicBulletMoveSpeed * 2 / 3; | |||
| public override int CastTime => GameData.basicCastTime; | |||
| public override int Backswing => GameData.basicBackswing; | |||
| @@ -105,10 +105,10 @@ namespace GameClass.GameObj | |||
| base(player, radius, placeType, pos) | |||
| { | |||
| } | |||
| public override double BulletBombRange => GameData.basicBulletBombRange / 6 * 5; | |||
| public override double BulletBombRange => GameData.basicBulletBombRange * 5 / 6; | |||
| 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 AP => GameData.basicApOfGhost * 5 / 6; | |||
| public override int Speed => GameData.basicBulletMoveSpeed * 5 / 6; | |||
| public override int CastTime => GameData.basicCastTime; | |||
| public override int Backswing => GameData.basicBackswing; | |||
| @@ -137,7 +137,7 @@ namespace GameClass.GameObj | |||
| base(player, radius, placeType, pos) | |||
| { | |||
| } | |||
| public override double BulletBombRange => GameData.basicBulletBombRange / 4 * 2; | |||
| public override double BulletBombRange => GameData.basicBulletBombRange * 2 / 4; | |||
| public override double BulletAttackRange => GameData.basicAttackShortRange; | |||
| public override int AP => (int)(0.5 * GameData.basicApOfGhost); | |||
| public override int Speed => 5 * GameData.basicBulletMoveSpeed / 3; | |||
| @@ -168,9 +168,9 @@ namespace GameClass.GameObj | |||
| base(player, radius, placeType, pos) | |||
| { | |||
| } | |||
| public override double BulletBombRange => GameData.basicBulletBombRange / 3 * 4; | |||
| public override double BulletBombRange => GameData.basicBulletBombRange * 4 / 3; | |||
| public override double BulletAttackRange => 0.1 * GameData.basicAttackShortRange; | |||
| public override int AP => GameData.basicApOfGhost / 3 * 2; | |||
| public override int AP => GameData.basicApOfGhost * 2 / 3; | |||
| public override int Speed => GameData.basicBulletMoveSpeed / 3; | |||
| public override int CastTime => GameData.basicCastTime; | |||
| public override int Backswing => GameData.basicBackswing; | |||
| @@ -9,23 +9,22 @@ namespace GameClass.GameObj | |||
| { | |||
| private readonly CharacterType characterType; | |||
| public CharacterType CharacterType => characterType; | |||
| private readonly IOccupation? occupation; | |||
| private readonly IOccupation occupation; | |||
| public IOccupation Occupation => occupation; | |||
| private Dictionary<ActiveSkillType, int> timeUntilActiveSkillAvailable = new(); | |||
| public Dictionary<ActiveSkillType, int> TimeUntilActiveSkillAvailable => timeUntilActiveSkillAvailable; | |||
| private Dictionary<ActiveSkillType, IActiveSkill> iActiveSkillDictionary = new(); | |||
| public Dictionary<ActiveSkillType, IActiveSkill> IActiveSkillDictionary => iActiveSkillDictionary; | |||
| public IActiveSkill? UseIActiveSkill(ActiveSkillType activeSkillType) | |||
| public IActiveSkill UseIActiveSkill(ActiveSkillType activeSkillType) | |||
| { | |||
| if (Occupation.ListOfIActiveSkill.Contains(activeSkillType)) | |||
| { | |||
| return IActiveSkillDictionary[activeSkillType]; | |||
| } | |||
| return null; | |||
| return new NullSkill(); | |||
| } | |||
| public bool SetTimeUntilActiveSkillAvailable(ActiveSkillType activeSkillType, int timeUntilActiveSkillAvailable) | |||
| @@ -67,10 +66,8 @@ namespace GameClass.GameObj | |||
| this.occupation = new Assassin(); | |||
| break; | |||
| case CharacterType.Athlete: | |||
| this.occupation = new Athlete(); | |||
| break; | |||
| default: | |||
| this.occupation = null; | |||
| this.occupation = new Athlete(); | |||
| break; | |||
| } | |||
| this.MaxHp = Occupation.MaxHp; | |||
| @@ -10,8 +10,6 @@ namespace GameClass.GameObj | |||
| private readonly object commonSkillLock = new object(); | |||
| public object ActiveSkillLock => commonSkillLock; | |||
| public bool IsBeingUsed { get; set; } | |||
| } | |||
| public class CanBeginToCharge : IActiveSkill | |||
| { | |||
| @@ -20,8 +18,6 @@ namespace GameClass.GameObj | |||
| private readonly object commonSkillLock = new object(); | |||
| public object ActiveSkillLock => commonSkillLock; | |||
| public bool IsBeingUsed { get; set; } | |||
| } | |||
| public class BecomeInvisible : IActiveSkill | |||
| @@ -31,8 +27,6 @@ namespace GameClass.GameObj | |||
| private readonly object commonSkillLock = new object(); | |||
| public object ActiveSkillLock => commonSkillLock; | |||
| public bool IsBeingUsed { get; set; } | |||
| } | |||
| public class NuclearWeapon : IActiveSkill // 核武器 | |||
| @@ -41,8 +35,6 @@ namespace GameClass.GameObj | |||
| public int DurationTime => GameData.commonSkillTime / 10; | |||
| private readonly object commonSkillLock = new object(); | |||
| public object ActiveSkillLock => commonSkillLock; | |||
| public bool IsBeingUsed { get; set; } | |||
| } | |||
| public class UseKnife : IActiveSkill | |||
| @@ -51,8 +43,6 @@ namespace GameClass.GameObj | |||
| public int DurationTime => GameData.commonSkillTime / 10; | |||
| private readonly object commonSkillLock = new object(); | |||
| public object ActiveSkillLock => commonSkillLock; | |||
| public bool IsBeingUsed { get; set; } | |||
| } | |||
| public class SuperFast : IActiveSkill // 3倍速 | |||
| @@ -61,13 +51,19 @@ namespace GameClass.GameObj | |||
| public int DurationTime => GameData.commonSkillTime / 10 * 4; | |||
| private readonly object commonSkillLock = new object(); | |||
| public object ActiveSkillLock => commonSkillLock; | |||
| } | |||
| public bool IsBeingUsed { get; set; } | |||
| public class NullSkill : IActiveSkill | |||
| { | |||
| public int SkillCD => GameData.commonSkillCD; | |||
| public int DurationTime => GameData.commonSkillTime; | |||
| private readonly object commonSkillLock = new object(); | |||
| public object ActiveSkillLock => commonSkillLock; | |||
| } | |||
| public static class SkillFactory | |||
| { | |||
| public static IActiveSkill? FindIActiveSkill(ActiveSkillType activeSkillType) | |||
| public static IActiveSkill FindIActiveSkill(ActiveSkillType activeSkillType) | |||
| { | |||
| switch (activeSkillType) | |||
| { | |||
| @@ -76,7 +72,7 @@ namespace GameClass.GameObj | |||
| case ActiveSkillType.UseKnife: | |||
| return new UseKnife(); | |||
| default: | |||
| return null; | |||
| return new NullSkill(); | |||
| } | |||
| } | |||
| @@ -31,7 +31,7 @@ namespace Preparation.Interface | |||
| public class Assassin : IGhost | |||
| { | |||
| private const int moveSpeed = GameData.basicMoveSpeed / 380 * 473; | |||
| private const int moveSpeed = GameData.basicMoveSpeed * 473 / 380; | |||
| public int MoveSpeed => moveSpeed; | |||
| private const int maxHp = GameData.basicHp; | |||
| @@ -65,7 +65,7 @@ namespace Preparation.Interface | |||
| } | |||
| public class Teacher : IStudent | |||
| { | |||
| private const int moveSpeed = GameData.basicMoveSpeed / 42 * 36; | |||
| private const int moveSpeed = GameData.basicMoveSpeed * 3 / 4; | |||
| public int MoveSpeed => moveSpeed; | |||
| private const int maxHp = GameData.basicHp * 10; | |||
| @@ -79,10 +79,10 @@ namespace Preparation.Interface | |||
| public List<ActiveSkillType> ListOfIActiveSkill => new(new ActiveSkillType[] { ActiveSkillType.CanBeginToCharge }); | |||
| public List<PassiveSkillType> ListOfIPassiveSkill => new(new PassiveSkillType[] { }); | |||
| public const int fixSpeed = GameData.basicFixSpeed / 10 * 6; | |||
| public const int fixSpeed = GameData.basicFixSpeed * 6 / 10; | |||
| public int FixSpeed => fixSpeed; | |||
| public const int treatSpeed = GameData.basicTreatSpeed / 10 * 8; | |||
| public const int treatSpeed = GameData.basicTreatSpeed * 8 / 10; | |||
| public int TreatSpeed => treatSpeed; | |||
| public const double concealment = GameData.basicConcealment * 0.9; | |||
| @@ -105,10 +105,10 @@ namespace Preparation.Interface | |||
| } | |||
| public class Athlete : IStudent | |||
| { | |||
| private const int moveSpeed = GameData.basicMoveSpeed / 38 * 40; | |||
| private const int moveSpeed = GameData.basicMoveSpeed * 40 / 38; | |||
| public int MoveSpeed => moveSpeed; | |||
| private const int maxHp = GameData.basicHp / 30 * 32; | |||
| private const int maxHp = GameData.basicHp * 32 / 30; | |||
| public int MaxHp => maxHp; | |||
| public const int maxBulletNum = 0; | |||
| @@ -119,10 +119,10 @@ namespace Preparation.Interface | |||
| public List<ActiveSkillType> ListOfIActiveSkill => new(new ActiveSkillType[] { ActiveSkillType.CanBeginToCharge }); | |||
| public List<PassiveSkillType> ListOfIPassiveSkill => new(new PassiveSkillType[] { }); | |||
| public const int fixSpeed = GameData.basicFixSpeed / 10 * 6; | |||
| public const int fixSpeed = GameData.basicFixSpeed * 6 / 10; | |||
| public int FixSpeed => fixSpeed; | |||
| public const int treatSpeed = GameData.basicTreatSpeed / 10 * 8; | |||
| public const int treatSpeed = GameData.basicTreatSpeed * 8 / 10; | |||
| public int TreatSpeed => treatSpeed; | |||
| public const double concealment = GameData.basicConcealment * 0.9; | |||
| @@ -11,6 +11,5 @@ | |||
| public int SkillCD { get; } | |||
| public int DurationTime { get; } //技能持续时间 | |||
| public object ActiveSkillLock { get; } | |||
| public bool IsBeingUsed { get; set; } | |||
| } | |||
| } | |||