diff --git a/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs b/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs index c2283c4..122e71d 100644 --- a/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs +++ b/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs @@ -32,16 +32,15 @@ namespace GameClass.GameObj { } public override double BulletBombRange => 0; - public override double BulletAttackRange => GameData.basicAttackShortRange * 13; - public override int AP => GameData.basicApOfGhost / 3 * 7; - public override int Speed => GameData.basicBulletMoveSpeed / 3 * 2; - public override bool IsToBomb => true; - public override int Backswing => GameData.basicBackswing; - public override int RecoveryFromHit => GameData.basicRecoveryFromHit; + public override double BulletAttackRange => GameData.basicRemoteAttackRange * 13; + public override int AP => GameData.basicApOfGhost / 5 * 4; + public override int Speed => GameData.basicBulletMoveSpeed * 2; + public override bool IsToBomb => false; + public override int Backswing => GameData.basicBackswing / 5 * 3; + public override int RecoveryFromHit => GameData.basicRecoveryFromHit / 4 * 3; public override bool CanAttack(GameObj target) { - // 圆形攻击范围 - return XY.Distance(this.Position, target.Position) <= BulletBombRange; + return false; } public override BulletType TypeOfBullet => BulletType.FlyingKnife; diff --git a/logic/GameClass/GameObj/Character/Character.BuffManager.cs b/logic/GameClass/GameObj/Character/Character.BuffManager.cs index f72284e..fc2e2af 100644 --- a/logic/GameClass/GameObj/Character/Character.BuffManager.cs +++ b/logic/GameClass/GameObj/Character/Character.BuffManager.cs @@ -8,11 +8,11 @@ namespace GameClass.GameObj { public partial class Character { - private readonly BuffManeger buffManeger; + private readonly BuffManager buffManager; /// /// 角色携带的buff管理器 /// - private class BuffManeger + private class BuffManager { [StructLayout(LayoutKind.Explicit, Size = 8)] private struct BuffValue // buff参数联合体类型,可能是int或double @@ -158,7 +158,7 @@ namespace GameClass.GameObj } } - public BuffManeger() + public BuffManager() { var buffTypeArray = Enum.GetValues(typeof(BuffType)); buffList = new LinkedList[buffTypeArray.Length]; diff --git a/logic/GameClass/GameObj/Character/Character.SkillManager.cs b/logic/GameClass/GameObj/Character/Character.SkillManager.cs index 5926228..25e6abf 100644 --- a/logic/GameClass/GameObj/Character/Character.SkillManager.cs +++ b/logic/GameClass/GameObj/Character/Character.SkillManager.cs @@ -66,7 +66,7 @@ namespace GameClass.GameObj this.CanMove = true; this.score = 0; this.propInventory = null; - this.buffManeger = new BuffManeger(); + this.buffManager = new BuffManager(); switch (characterType) { case CharacterType.Assassin: diff --git a/logic/GameClass/GameObj/Character/Character.cs b/logic/GameClass/GameObj/Character/Character.cs index 028863b..f5ca394 100644 --- a/logic/GameClass/GameObj/Character/Character.cs +++ b/logic/GameClass/GameObj/Character/Character.cs @@ -31,7 +31,7 @@ namespace GameClass.GameObj } public int OrgCD { get; protected set; } - protected int fixSpeed = 1; + protected int fixSpeed = GameData.basicFixSpeed; /// /// 修理电机速度 /// @@ -49,7 +49,35 @@ namespace GameClass.GameObj /// /// 原初修理电机速度 /// - public int OrgFixSpeed { get; protected set; } + public int OrgFixSpeed { get; protected set; } = GameData.basicFixSpeed; + + protected int treatSpeed = GameData.basicTreatSpeed; + public int TreatSpeed + { + get => treatSpeed; + set + { + lock (gameObjLock) + { + treatSpeed = value; + } + } + } + public int OrgTreatSpeed { get; protected set; } = GameData.basicTreatSpeed; + + protected int rescueSpeed = GameData.basicRescueSpeed; + public int RescueSpeed + { + get => rescueSpeed; + set + { + lock (gameObjLock) + { + rescueSpeed = value; + } + } + } + public int OrgRescueSpeed { get; protected set; } = GameData.basicRescueSpeed; protected int maxBulletNum; public int MaxBulletNum => maxBulletNum; // 人物最大子弹数 @@ -63,20 +91,49 @@ namespace GameClass.GameObj get => hp; set { - lock (gameObjLock) - hp = value <= MaxHp ? value : MaxHp; + if (value > 0) + { + lock (gameObjLock) + hp = value <= MaxHp ? value : MaxHp; + } + else + lock (gameObjLock) + hp = 0; } } - private bool isEscaped = false; - public bool IsEscaped + public int MaxGamingAddiction { get; protected set; } + private int gamingAddiction; + public int GamingAddiction { - get => isEscaped; + get => gamingAddiction; set { - lock (gameObjLock) - if (!isEscaped && !IsGhost()) - isEscaped = value; + if (gamingAddiction > 0) + lock (gameObjLock) + gamingAddiction = value <= MaxGamingAddiction ? value : MaxGamingAddiction; + else + lock (gameObjLock) + gamingAddiction = 0; + } + } + + private PlayerStateType playerState = PlayerStateType.Null; + public PlayerStateType PlayerState + { + get + { + if (IsResetting) return PlayerStateType.IsResetting; + if (IsMoving) return PlayerStateType.IsMoving; + return playerState; + } + set + { + if (value != PlayerStateType.IsMoving && value != PlayerStateType.Null) + lock (gameObjLock) + CanMove = false; + + lock (gameObjLock) playerState = value; } } @@ -126,6 +183,32 @@ namespace GameClass.GameObj } } + private int selfHealingTimes = 1;//剩余的自愈次数 + public int SelfHealingTimes + { + get => selfHealingTimes; + set + { + lock (gameObjLock) + selfHealingTimes = (value > 0) ? value : 0; + } + } + + private int degreeOfTreatment = 0; + public int DegreeOfTreatment + { + get => degreeOfTreatment; + set + { + if (value > 0) + lock (gameObjLock) + degreeOfTreatment = (value < MaxHp - HP) ? value : MaxHp - HP; + else + lock (gameObjLock) + degreeOfTreatment = 0; + } + } + public readonly BulletType OriBulletOfPlayer; private BulletType bulletOfPlayer; public BulletType BulletOfPlayer @@ -166,22 +249,6 @@ namespace GameClass.GameObj } } - /// - /// 是否正在更换道具(包括捡起与抛出) - /// - private bool isModifyingProp = false; - public bool IsModifyingProp - { - get => isModifyingProp; - set - { - lock (gameObjLock) - { - isModifyingProp = value; - } - } - } - /// /// 是否在隐身 /// @@ -423,19 +490,19 @@ namespace GameClass.GameObj #endregion #region 角色拥有的buff相关属性、方法 - public void AddMoveSpeed(int buffTime, double add = 2.0) => buffManeger.AddMoveSpeed(add, buffTime, newVal => + public void AddMoveSpeed(int buffTime, double add = 2.0) => buffManager.AddMoveSpeed(add, buffTime, newVal => { MoveSpeed = newVal < GameData.characterMaxSpeed ? newVal : GameData.characterMaxSpeed; }, OrgMoveSpeed); - public bool HasFasterSpeed => buffManeger.HasFasterSpeed; + public bool HasFasterSpeed => buffManager.HasFasterSpeed; - public void AddShield(int shieldTime) => buffManeger.AddShield(shieldTime); - public bool HasShield => buffManeger.HasShield; + public void AddShield(int shieldTime) => buffManager.AddShield(shieldTime); + public bool HasShield => buffManager.HasShield; - public void AddLIFE(int LIFETime) => buffManeger.AddLIFE(LIFETime); - public bool HasLIFE => buffManeger.HasLIFE; + public void AddLIFE(int LIFETime) => buffManager.AddLIFE(LIFETime); + public bool HasLIFE => buffManager.HasLIFE; - public void AddSpear(int spearTime) => buffManeger.AddSpear(spearTime); - public bool HasSpear => buffManeger.HasSpear; + public void AddSpear(int spearTime) => buffManager.AddSpear(spearTime); + public bool HasSpear => buffManager.HasSpear; private Array buffTypeArray = Enum.GetValues(typeof(BuffType)); public Dictionary Buff @@ -469,7 +536,7 @@ namespace GameClass.GameObj } private void TryActivatingLIFE() { - if (buffManeger.TryActivatingLIFE()) + if (buffManager.TryActivatingLIFE()) { hp = MaxHp; } @@ -488,7 +555,7 @@ namespace GameClass.GameObj lock (gameObjLock) bulletNum = maxBulletNum; - buffManeger.ClearAll(); + buffManager.ClearAll(); IsInvisible = false; this.Vampire = this.OriVampire; } @@ -497,7 +564,8 @@ namespace GameClass.GameObj public void Escape() { lock (gameObjLock) - IsResetting = IsEscaped = true; + IsResetting = true; + PlayerState = PlayerStateType.IsEscaped; } public override bool IsRigid => true; public override ShapeType Shape => ShapeType.Circle; diff --git a/logic/GameClass/Skill/ActiveSkill.cs b/logic/GameClass/Skill/ActiveSkill.cs index c2ab75d..6d7d18f 100644 --- a/logic/GameClass/Skill/ActiveSkill.cs +++ b/logic/GameClass/Skill/ActiveSkill.cs @@ -9,13 +9,6 @@ namespace GameClass.Skill { public class BecomeVampire : IActiveSkill // 化身吸血鬼 { - private const int moveSpeed = GameData.basicMoveSpeed; - public int MoveSpeed => moveSpeed; - - private const int maxHp = (int)(GameData.basicHp / 6 * 9.5); - public int MaxHp => maxHp; - - // 以上参数以后再改 public int SkillCD => GameData.commonSkillCD / 3 * 4; public int DurationTime => GameData.commonSkillTime; @@ -56,15 +49,6 @@ namespace GameClass.Skill } public class NuclearWeapon : IActiveSkill // 核武器 { - private const int moveSpeed = GameData.basicMoveSpeed / 3 * 4; - public int MoveSpeed => moveSpeed; - - private const int maxHp = GameData.basicHp; - public int MaxHp => maxHp; - - private const int maxBulletNum = GameData.basicBulletNum * 2 / 3; - public int MaxBulletNum => maxBulletNum; - // 以上参数以后再改 public int SkillCD => GameData.commonSkillCD / 3 * 7; public int DurationTime => GameData.commonSkillTime / 10; private readonly object commonSkillLock = new object(); @@ -80,17 +64,25 @@ namespace GameClass.Skill { player.BulletOfPlayer = player.OriBulletOfPlayer; }); } } + public class UseKnife : IActiveSkill + { + public int SkillCD => GameData.commonSkillCD / 3 * 2; + public int DurationTime => GameData.commonSkillTime / 10; + private readonly object commonSkillLock = new object(); + public object ActiveSkillLock => commonSkillLock; + public bool SkillEffect(Character player) + { + return ActiveSkillFactory.SkillEffect(this, player, () => + { + player.BulletOfPlayer = BulletType.FlyingKnife; + Debugger.Output(player, "uses flyingknife!"); + }, + () => + { player.BulletOfPlayer = player.OriBulletOfPlayer; }); + } + } public class SuperFast : IActiveSkill // 3倍速 { - private const int moveSpeed = GameData.basicMoveSpeed * 4 / 3; - public int MoveSpeed => moveSpeed; - - private const int maxHp = GameData.basicHp / 6 * 4; - public int MaxHp => maxHp; - - private const int maxBulletNum = GameData.basicBulletNum * 4 / 3; - public int MaxBulletNum => maxBulletNum; - // 以上参数以后再改 public int SkillCD => GameData.commonSkillCD; public int DurationTime => GameData.commonSkillTime / 10 * 4; private readonly object commonSkillLock = new object(); @@ -108,15 +100,6 @@ namespace GameClass.Skill } public class NoCommonSkill : IActiveSkill // 这种情况不该发生,定义着以防意外 { - private const int moveSpeed = GameData.basicMoveSpeed; - public int MoveSpeed => moveSpeed; - - private const int maxHp = GameData.basicHp; - public int MaxHp => maxHp; - - private const int maxBulletNum = GameData.basicBulletNum; - public int MaxBulletNum => maxBulletNum; - // 以上参数以后再改 public int SkillCD => GameData.commonSkillCD; public int DurationTime => GameData.commonSkillTime; private readonly object commonSkillLock = new object(); diff --git a/logic/GameClass/Skill/Occupation.cs b/logic/GameClass/Skill/Occupation.cs index 2b6e2bb..c2186af 100644 --- a/logic/GameClass/Skill/Occupation.cs +++ b/logic/GameClass/Skill/Occupation.cs @@ -1,8 +1,5 @@ using GameClass.GameObj; -using System.Threading; -using Preparation.Interface; using Preparation.Utility; -using System; using System.Collections.Generic; namespace GameClass.Skill @@ -33,7 +30,7 @@ namespace GameClass.Skill public BulletType InitBullet => BulletType.CommonAttackOfGhost; - public List ListOfIActiveSkill => new(new IActiveSkill[] { new BecomeInvisible(), }); + public List ListOfIActiveSkill => new(new IActiveSkill[] { new BecomeInvisible(), new UseKnife() }); public List ListOfIPassiveSkill => new(new IPassiveSkill[] { }); } diff --git a/logic/Gaming/ActionManager.cs b/logic/Gaming/ActionManager.cs index 6ac60db..5fe3625 100644 --- a/logic/Gaming/ActionManager.cs +++ b/logic/Gaming/ActionManager.cs @@ -1,8 +1,10 @@ using System; using System.Runtime.InteropServices; +using System.Threading; using GameClass.GameObj; using GameEngine; using Preparation.Utility; +using Timothy.FrameRateTask; namespace Gaming { @@ -18,9 +20,9 @@ namespace Gaming moveEngine.MoveObj(playerToMove, moveTimeInMilliseconds, moveDirection); } - public bool TryToFix(Character player)// 自动检查有无发电机可修 + public bool Fix(Character player)// 自动检查有无发电机可修 { - if (player.IsResetting || player.IsGhost()) + if (player.PlayerState != PlayerStateType.Null || player.IsGhost()) return false; Generator? generatorForFix = null; @@ -42,54 +44,72 @@ namespace Gaming gameMap.GameObjLockDict[GameObjType.Generator].ExitReadLock(); } + if (generatorForFix == null || generatorForFix.DegreeOfFRepair == GameData.degreeOfFixedGenerator) + return false; + + player.PlayerState = PlayerStateType.IsFixing; + new Thread + ( + () => + { + new FrameRateTaskExecutor( + loopCondition: () => player.PlayerState == PlayerStateType.IsFixing && generatorForFix.DegreeOfFRepair < GameData.degreeOfFixedGenerator && GameData.ApproachToInteract(player.Position, generatorForFix.Position), + loopToDo: () => + { + return !generatorForFix.Repair(player.FixSpeed * GameData.frameDuration); + }, + timeInterval: GameData.frameDuration, + finallyReturn: () => 0 + ) + + .Start(); + } + ) + { IsBackground = true }.Start(); - if (generatorForFix != null) + if (generatorForFix.DegreeOfFRepair == GameData.degreeOfFixedGenerator) { gameMap.GameObjLockDict[GameObjType.Generator].EnterReadLock(); try { - if (generatorForFix.Repair(player.FixSpeed)) + Doorway exit = (Doorway)gameMap.GameObjDict[GameObjType.Doorway][1]; + if (!exit.PowerSupply) { - Doorway exit = (Doorway)gameMap.GameObjDict[GameObjType.Doorway][1]; - if (!exit.PowerSupply) + int numOfFixedGenerator = 0; + foreach (Generator generator in gameMap.GameObjDict[GameObjType.Generator]) + if (generator.DegreeOfFRepair == GameData.degreeOfFixedGenerator) + ++numOfFixedGenerator; + if (numOfFixedGenerator >= GameData.numOfGeneratorRequiredForRepair) { - int numOfFixedGenerator = 0; - foreach (Generator generator in gameMap.GameObjDict[GameObjType.Generator]) - if (generator.DegreeOfFRepair == GameData.degreeOfFixedGenerator) - ++numOfFixedGenerator; - if (numOfFixedGenerator >= GameData.numOfGeneratorRequiredForRepair) + gameMap.GameObjLockDict[GameObjType.Doorway].EnterWriteLock(); + try { - gameMap.GameObjLockDict[GameObjType.Doorway].EnterWriteLock(); - try - { - foreach (Doorway doorway in gameMap.GameObjDict[GameObjType.Doorway]) - doorway.PowerSupply = true; - } - finally - { - gameMap.GameObjLockDict[GameObjType.Doorway].ExitWriteLock(); - } + foreach (Doorway doorway in gameMap.GameObjDict[GameObjType.Doorway]) + doorway.PowerSupply = true; + } + finally + { + gameMap.GameObjLockDict[GameObjType.Doorway].ExitWriteLock(); } } } } + finally { gameMap.GameObjLockDict[GameObjType.Generator].ExitReadLock(); } return true; } - else - return false; + return false; } - public bool TryToEscape(Character player) + public bool Escape(Character player) { - if (player.IsResetting || player.IsGhost()) + if (!(player.PlayerState == PlayerStateType.Null || player.PlayerState == PlayerStateType.IsMoving) || player.IsGhost()) return false; Doorway? doorwayForEscape = null; - gameMap.GameObjLockDict[GameObjType.Doorway].EnterReadLock(); try { @@ -116,6 +136,103 @@ namespace Gaming else return false; } + + public bool Treat(Character player, Character playerTreated) + { + if (playerTreated.PlayerState == PlayerStateType.Null || player.PlayerState == PlayerStateType.Null || playerTreated.HP == playerTreated.MaxHp || !GameData.ApproachToInteract(playerTreated.Position, player.Position)) + return false; + + if (playerTreated.HP + playerTreated.DegreeOfTreatment >= playerTreated.MaxHp) + { + playerTreated.HP = playerTreated.MaxHp; + playerTreated.DegreeOfTreatment = 0; + return true; + } + + if (playerTreated.DegreeOfTreatment >= GameData.basicTreatmentDegree) + { + playerTreated.HP += GameData.basicTreatmentDegree; + playerTreated.DegreeOfTreatment = 0; + return true; + } + new Thread + ( + () => + { + new FrameRateTaskExecutor( + loopCondition: () => playerTreated.PlayerState == PlayerStateType.IsTreated && player.PlayerState == PlayerStateType.IsTreating && playerTreated.HP + playerTreated.DegreeOfTreatment < playerTreated.MaxHp && playerTreated.DegreeOfTreatment >= GameData.basicTreatmentDegree && GameData.ApproachToInteract(playerTreated.Position, player.Position), + loopToDo: () => + { + playerTreated.DegreeOfTreatment += GameData.frameDuration * player.TreatSpeed; + }, + timeInterval: GameData.frameDuration, + finallyReturn: () => 0 + ) + + .Start(); + } + ) + { IsBackground = true }.Start(); + + if (playerTreated.PlayerState == PlayerStateType.IsTreated) playerTreated.PlayerState = PlayerStateType.Null; + if (player.PlayerState == PlayerStateType.IsTreating) player.PlayerState = PlayerStateType.Null; + + if (playerTreated.HP + playerTreated.DegreeOfTreatment >= playerTreated.MaxHp) + { + playerTreated.HP = playerTreated.MaxHp; + playerTreated.DegreeOfTreatment = 0; + return true; + } + + if (playerTreated.DegreeOfTreatment >= GameData.basicTreatmentDegree) + { + playerTreated.HP += GameData.basicTreatmentDegree; + playerTreated.DegreeOfTreatment = 0; + return true; + } + return false; + } + + public bool Rescue(Character player, Character playerRescued) + { + if (player.PlayerState != PlayerStateType.Null || playerRescued.PlayerState != PlayerStateType.IsAddicted || !GameData.ApproachToInteract(playerRescued.Position, player.Position)) + return false; + player.PlayerState = PlayerStateType.IsRescuing; + playerRescued.PlayerState = PlayerStateType.IsRescued; + int rescuedDegree = 0; + new Thread + ( + () => + { + new FrameRateTaskExecutor( + loopCondition: () => playerRescued.PlayerState == PlayerStateType.IsRescued && player.PlayerState == PlayerStateType.IsRescuing && GameData.ApproachToInteract(playerRescued.Position, player.Position), + loopToDo: () => + { + rescuedDegree += GameData.frameDuration; + }, + timeInterval: GameData.frameDuration, + finallyReturn: () => 0, + maxTotalDuration: 1000 + ) + + .Start(); + } + ) + { IsBackground = true }.Start(); + if (rescuedDegree == 1000) + { + if (playerRescued.PlayerState == PlayerStateType.IsRescued) playerRescued.PlayerState = PlayerStateType.Null; + if (player.PlayerState == PlayerStateType.IsRescuing) player.PlayerState = PlayerStateType.Null; + return true; + } + else + { + if (playerRescued.PlayerState == PlayerStateType.IsRescued) playerRescued.PlayerState = PlayerStateType.Null; + if (player.PlayerState == PlayerStateType.IsRescuing) player.PlayerState = PlayerStateType.IsAddicted; + return false; + } + } + /* private void ActivateMine(Character player, Mine mine) { diff --git a/logic/Gaming/AttackManager.cs b/logic/Gaming/AttackManager.cs index 7415e5e..0eaca15 100644 --- a/logic/Gaming/AttackManager.cs +++ b/logic/Gaming/AttackManager.cs @@ -5,6 +5,7 @@ using GameClass.GameObj; using Preparation.Utility; using GameEngine; using Preparation.Interface; +using Timothy.FrameRateTask; namespace Gaming { @@ -35,75 +36,114 @@ namespace Gaming } ); } - private bool CanBeBombed(Bullet bullet, GameObjType gameObjType) + + public void BeAddictedToGame(Character player) { - if (gameObjType == GameObjType.Character) return true; - return false; + new Thread + (() => + { + if (player.GamingAddiction > GameData.BeginGamingAddiction && player.GamingAddiction < GameData.MidGamingAddiction) + player.GamingAddiction = GameData.MidGamingAddiction; + player.PlayerState = PlayerStateType.IsAddicted; + new FrameRateTaskExecutor( + () => player.PlayerState == PlayerStateType.IsAddicted && player.GamingAddiction < player.MaxGamingAddiction, + () => + { + player.GamingAddiction += GameData.frameDuration; + }, + timeInterval: GameData.frameDuration, + () => + { + if (player.GamingAddiction == player.MaxGamingAddiction) + { + player.PlayerState = PlayerStateType.Null; + Die(player); + } + else player.CanMove = true; + return 0; + } + ) + .Start(); + } + ) + { IsBackground = true }.Start(); } - private void BombObj(Bullet bullet, GameObj objBeingShot) + + public void Die(Character player) { - switch (objBeingShot.Type) + + player.CanMove = false; + player.IsResetting = true; + // gameMap.GameObjLockDict[GameObjType.Character].EnterWriteLock(); + // try + //{ + // gameMap.GameObjDict[GameObjType.Character].Remove(playerBeingShot); + // } + // finally + //{ + // gameMap.GameObjLockDict[GameObjType.Character].ExitWriteLock(); + // } + + Prop? dropProp = null; + if (player.PropInventory != null) // 若角色原来有道具,则原始道具掉落在原地 { - case GameObjType.Character: - Character playerBeingShot = (Character)objBeingShot; - if (playerBeingShot.BeAttacked(bullet)) + dropProp = player.PropInventory; + dropProp.SetNewPos(GameData.GetCellCenterPos(player.Position.x / GameData.numOfPosGridPerCell, player.Position.y / GameData.numOfPosGridPerCell)); + } + gameMap.GameObjLockDict[GameObjType.Prop].EnterWriteLock(); + try + { + if (dropProp != null) + gameMap.GameObjDict[GameObjType.Prop].Add(dropProp); + } + finally + { + gameMap.GameObjLockDict[GameObjType.Prop].ExitWriteLock(); + } + + player.Reset(); + // ((Character?)bullet.Parent)?.AddScore(GameData.addScoreWhenKillOneLevelPlayer); // 给击杀者加分 + + /* new Thread + (() => { - playerBeingShot.CanMove = false; - playerBeingShot.IsResetting = true; + + Thread.Sleep(GameData.reviveTime); + + playerBeingShot.AddShield(GameData.shieldTimeAtBirth); // 复活加个盾 + // gameMap.GameObjLockDict[GameObjType.Character].EnterWriteLock(); // try //{ - // gameMap.GameObjDict[GameObjType.Character].Remove(playerBeingShot); - // } - // finally - //{ - // gameMap.GameObjLockDict[GameObjType.Character].ExitWriteLock(); + // gameMap.GameObjDict[GameObjType.Character].Add(playerBeingShot); // } + // finally { gameMap.GameObjLockDict[GameObjType.Character].ExitWriteLock(); } - Prop? dropProp = null; - if (playerBeingShot.PropInventory != null) // 若角色原来有道具,则原始道具掉落在原地 + if (gameMap.Timer.IsGaming) { - dropProp = playerBeingShot.PropInventory; - dropProp.SetNewPos(GameData.GetCellCenterPos(playerBeingShot.Position.x / GameData.numOfPosGridPerCell, playerBeingShot.Position.y / GameData.numOfPosGridPerCell)); + playerBeingShot.CanMove = true; } - gameMap.GameObjLockDict[GameObjType.Prop].EnterWriteLock(); - try - { - if (dropProp != null) - gameMap.GameObjDict[GameObjType.Prop].Add(dropProp); - } - finally - { - gameMap.GameObjLockDict[GameObjType.Prop].ExitWriteLock(); - } - - playerBeingShot.Reset(); - ((Character?)bullet.Parent)?.AddScore(GameData.addScoreWhenKillOneLevelPlayer); // 给击杀者加分 - - /* new Thread - (() => - { - - Thread.Sleep(GameData.reviveTime); - - playerBeingShot.AddShield(GameData.shieldTimeAtBirth); // 复活加个盾 - - // gameMap.GameObjLockDict[GameObjType.Character].EnterWriteLock(); - // try - //{ - // gameMap.GameObjDict[GameObjType.Character].Add(playerBeingShot); - // } - // finally { gameMap.GameObjLockDict[GameObjType.Character].ExitWriteLock(); } + playerBeingShot.IsResetting = false; + } + ) + { IsBackground = true }.Start(); + */ + } - if (gameMap.Timer.IsGaming) - { - playerBeingShot.CanMove = true; - } - playerBeingShot.IsResetting = false; - } - ) - { IsBackground = true }.Start(); - */ + private bool CanBeBombed(Bullet bullet, GameObjType gameObjType) + { + if (gameObjType == GameObjType.Character) return true; + return false; + } + private void BombObj(Bullet bullet, GameObj objBeingShot) + { + switch (objBeingShot.Type) + { + case GameObjType.Character: + Character playerBeingShot = (Character)objBeingShot; + if (playerBeingShot.BeAttacked(bullet)) + { + BeAddictedToGame(playerBeingShot); } break; } diff --git a/logic/Gaming/Game.cs b/logic/Gaming/Game.cs index 6a26a5d..24de635 100644 --- a/logic/Gaming/Game.cs +++ b/logic/Gaming/Game.cs @@ -57,7 +57,7 @@ namespace Gaming newPlayer.TeamID = playerInitInfo.teamID; newPlayer.PlayerID = playerInitInfo.playerID; - /*new Thread //人物装弹 + new Thread //人物装弹 ( () => { @@ -84,17 +84,17 @@ namespace Gaming finallyReturn: () => 0 ) { - AllowTimeExceed = true + AllowTimeExceed = true/*, MaxTolerantTimeExceedCount = 5, TimeExceedAction = exceedTooMuch => { if (exceedTooMuch) Console.WriteLine("The computer runs too slow that it cannot check the color below the player in time!"); - } + }*/ } .Start(); } ) - { IsBackground = true }.Start();*/ + { IsBackground = true }.Start(); return newPlayer.ID; } @@ -194,6 +194,52 @@ namespace Gaming #endif } } + public bool Treat(long playerID, long playerTreatedID) + { + if (!gameMap.Timer.IsGaming) + return false; + Character? player = gameMap.FindPlayer(playerID); + Character? playerTreated = gameMap.FindPlayer(playerTreatedID); + if (player != null && playerTreated != null) + { + return actionManager.Treat(player, playerTreated); + } + return false; + } + public bool Rescue(long playerID, long playerRescuedID) + { + if (!gameMap.Timer.IsGaming) + return false; + Character? player = gameMap.FindPlayer(playerID); + Character? playerRescued = gameMap.FindPlayer(playerRescuedID); + if (player != null && playerRescued != null) + { + return actionManager.Treat(player, playerRescued); + } + return false; + } + public bool Fix(long playerID) + { + if (!gameMap.Timer.IsGaming) + return false; + Character? player = gameMap.FindPlayer(playerID); + if (player != null) + { + return actionManager.Fix(player); + } + return false; + } + public bool Escape(long playerID) + { + if (!gameMap.Timer.IsGaming) + return false; + Character? player = gameMap.FindPlayer(playerID); + if (player != null) + { + return actionManager.Escape(player); + } + return false; + } public void Attack(long playerID, double angle) { if (!gameMap.Timer.IsGaming) diff --git a/logic/Preparation/Utility/EnumType.cs b/logic/Preparation/Utility/EnumType.cs index 6cecf56..ba70715 100644 --- a/logic/Preparation/Utility/EnumType.cs +++ b/logic/Preparation/Utility/EnumType.cs @@ -5,6 +5,20 @@ namespace Preparation.Utility /// 存放所有用到的枚举类型 /// // public const int numOfObjNotMap = 5;在GameData中 + public enum PlayerStateType + { + Null = 0, + IsAddicted = 1, + IsEscaped = 2, + IsSwinging = 3, + IsResetting = 4, + IsMoving = 5, + IsTreating = 6, + IsRescuing = 7, + IsFixing = 8, + IsTreated = 9, + IsRescued = 10, + } public enum GameObjType { Null = 0, @@ -72,7 +86,7 @@ namespace Preparation.Utility BecomeVampire = 2, NuclearWeapon = 3, SuperFast = 4, - ASkill4 = 5, + UseKnife = 5, ASkill5 = 6 } public enum PassiveSkillType diff --git a/logic/Preparation/Utility/GameData.cs b/logic/Preparation/Utility/GameData.cs index c00df8d..6e897a9 100644 --- a/logic/Preparation/Utility/GameData.cs +++ b/logic/Preparation/Utility/GameData.cs @@ -6,11 +6,12 @@ namespace Preparation.Utility #region 基本常数与常方法 public const int numOfPosGridPerCell = 1000; // 每格的【坐标单位】数 public const int numOfStepPerSecond = 20; // 每秒行走的步数 + public const int frameDuration = 50; // 每帧时长 + public const int lengthOfMap = 50000; // 地图长度 public const int rows = 50; // 行数 public const int cols = 50; // 列数 public const long gameDuration = 600000; // 游戏时长600000ms = 10min - public const long frameDuration = 50; // 每帧时长 public const int MinSpeed = 1; // 最小速度 public const int MaxSpeed = int.MaxValue; // 最大速度 @@ -45,8 +46,16 @@ namespace Preparation.Utility #endregion #region 角色相关 public const int characterRadius = numOfPosGridPerCell / 2; // 人物半径 - public const int basicApOfGhost = 500; // 初始攻击力 - public const int basicHp = 1003; // 初始血量 + public const int basicApOfGhost = 1500000; // 攻击力 + public const int basicTreatSpeed = 100; + public const int basicFixSpeed = 100; + public const int basicRescueSpeed = 100; + public const int basicMaxGamingAddiction = 60000;//基本完全沉迷时间 + public const int BeginGamingAddiction = 10003; + public const int MidGamingAddiction = 30000; + public const int basicTreatmentDegree = 1500000; + public const int basicRescueDegree = 100000; + public const int basicHp = 3000000; // 初始血量 public const int basicCD = 3000; // 初始子弹冷却 public const int basicBackswing = 500;//基本后摇时间 public const int basicRecoveryFromHit = 4300;//基本命中攻击恢复时长 @@ -78,7 +87,7 @@ namespace Preparation.Utility public const long PropProduceTime = 10000; public const int PropDuration = 10000; - public const int degreeOfFixedGenerator = 2000; + public const int degreeOfFixedGenerator = 10300000; #endregion #region 游戏帧相关 public const long checkInterval = 50; // 检查位置标志、补充子弹的帧时长