| @@ -1,10 +1,51 @@ | |||
| using Preparation.Utility; | |||
| using Preparation.Interface; | |||
| using System; | |||
| namespace GameClass.GameObj | |||
| { | |||
| public class Student : Character | |||
| { | |||
| private readonly object beAttackedLock = new(); | |||
| /// <summary> | |||
| /// 遭受攻击 | |||
| /// </summary> | |||
| /// <param name="subHP"></param> | |||
| /// <param name="hasSpear"></param> | |||
| /// <param name="attacker">伤害来源</param> | |||
| /// <returns>人物在受到攻击后死了吗</returns> | |||
| public bool BeAttacked(Bullet bullet) | |||
| { | |||
| lock (beAttackedLock) | |||
| { | |||
| if (hp <= 0 || NoHp()) | |||
| return false; // 原来已经死了 | |||
| if (bullet.Parent.TeamID != this.TeamID) | |||
| { | |||
| if (CanBeAwed()) PlayerState = PlayerStateType.Stunned; | |||
| if (HasShield) | |||
| { | |||
| if (bullet.HasSpear) | |||
| _ = TrySubHp(bullet.AP); | |||
| else | |||
| return false; | |||
| } | |||
| else | |||
| { | |||
| bullet.Parent.HP = (int)(bullet.Parent.HP + (bullet.Parent.Vampire * TrySubHp(bullet.AP))); | |||
| } | |||
| #if DEBUG | |||
| Console.WriteLine($"PlayerID:{ID} is being shot! Now his hp is {hp}."); | |||
| #endif | |||
| if (hp <= 0) | |||
| TryActivatingLIFE(); // 如果有复活甲 | |||
| } | |||
| return hp <= 0; | |||
| } | |||
| } | |||
| protected int fixSpeed; | |||
| /// <summary> | |||
| /// 修理电机速度 | |||
| @@ -10,9 +10,8 @@ namespace GameClass.GameObj | |||
| { | |||
| public partial class Character : Moveable, ICharacter // 负责人LHR摆烂终了 | |||
| { | |||
| private readonly object beAttackedLock = new(); | |||
| #region 装弹相关的基本属性及方法 | |||
| #region 装弹攻击相关的基本属性及方法 | |||
| /// <summary> | |||
| /// 装弹冷却 | |||
| /// </summary> | |||
| @@ -93,43 +92,7 @@ namespace GameClass.GameObj | |||
| } | |||
| } | |||
| /// <summary> | |||
| /// 遭受攻击 | |||
| /// </summary> | |||
| /// <param name="subHP"></param> | |||
| /// <param name="hasSpear"></param> | |||
| /// <param name="attacker">伤害来源</param> | |||
| /// <returns>人物在受到攻击后死了吗</returns> | |||
| public bool BeAttacked(Bullet bullet) | |||
| { | |||
| lock (beAttackedLock) | |||
| { | |||
| if (hp <= 0) | |||
| return false; // 原来已经死了 | |||
| if (bullet.Parent.TeamID != this.TeamID) | |||
| { | |||
| if (HasShield) | |||
| { | |||
| if (bullet.HasSpear) | |||
| _ = TrySubHp(bullet.AP); | |||
| else | |||
| return false; | |||
| } | |||
| else | |||
| { | |||
| bullet.Parent.HP = (int)(bullet.Parent.HP + (bullet.Parent.Vampire * TrySubHp(bullet.AP))); | |||
| } | |||
| #if DEBUG | |||
| Console.WriteLine($"PlayerID:{ID} is being shot! Now his hp is {hp}."); | |||
| #endif | |||
| if (hp <= 0) | |||
| TryActivatingLIFE(); // 如果有复活甲 | |||
| } | |||
| return hp <= 0; | |||
| } | |||
| } | |||
| /* | |||
| /// <summary> | |||
| /// 攻击被反弹,反弹伤害不会再被反弹 | |||
| /// </summary> | |||
| @@ -152,7 +115,7 @@ namespace GameClass.GameObj | |||
| } | |||
| return hp <= 0; | |||
| } | |||
| } | |||
| }*/ | |||
| #endregion | |||
| #region 感知相关的基本属性及方法 | |||
| /// <summary> | |||
| @@ -372,12 +335,18 @@ namespace GameClass.GameObj | |||
| } | |||
| } | |||
| public bool NoHp() => (playerState != PlayerStateType.Deceased && playerState != PlayerStateType.Escaped | |||
| && playerState != PlayerStateType.Addicted && playerState != PlayerStateType.Rescued); | |||
| public bool Commandable() => (playerState != PlayerStateType.Deceased && playerState != PlayerStateType.Escaped | |||
| && playerState != PlayerStateType.Addicted && playerState != PlayerStateType.Rescuing | |||
| && playerState != PlayerStateType.Addicted && playerState != PlayerStateType.Rescued | |||
| && playerState != PlayerStateType.Swinging && playerState != PlayerStateType.TryingToAttack | |||
| && playerState != PlayerStateType.ClimbingThroughWindows && playerState != PlayerStateType.Stunned); | |||
| public bool InteractingWithMapWithoutMoving() => (playerState == PlayerStateType.LockingOrOpeningTheDoor || playerState == PlayerStateType.Fixing || playerState == PlayerStateType.OpeningTheChest); | |||
| public bool NullOrMoving() => (playerState == PlayerStateType.Null || playerState == PlayerStateType.Moving); | |||
| public bool CanBeAwed() => !(playerState == PlayerStateType.Deceased || playerState == PlayerStateType.Escaped | |||
| || playerState == PlayerStateType.Addicted || playerState == PlayerStateType.Rescued | |||
| || playerState == PlayerStateType.Treated || playerState != PlayerStateType.Stunned | |||
| || playerState == PlayerStateType.Null || playerState == PlayerStateType.Moving); | |||
| private int score = 0; | |||
| public int Score | |||
| @@ -542,7 +511,7 @@ namespace GameClass.GameObj | |||
| return false; | |||
| } | |||
| } | |||
| private void TryActivatingLIFE() | |||
| protected void TryActivatingLIFE() | |||
| { | |||
| if (buffManager.TryActivatingLIFE()) | |||
| { | |||
| @@ -398,8 +398,7 @@ namespace Gaming | |||
| loopCondition: () => flag && player.PlayerState == PlayerStateType.LockingOrOpeningTheDoor && gameMap.Timer.IsGaming && doorToLock.OpenOrLockDegree < GameData.degreeOfLockingOrOpeningTheDoor, | |||
| loopToDo: () => | |||
| { | |||
| Character? character = (Character?)gameMap.OneInTheSameCell(doorToLock.Position, GameObjType.Character); | |||
| flag = (character != null); | |||
| flag = ((gameMap.OneInTheSameCell(doorToLock.Position, GameObjType.Character)) != null); | |||
| doorToLock.OpenOrLockDegree += GameData.frameDuration * player.SpeedOfOpeningOrLocking; | |||
| }, | |||
| timeInterval: GameData.frameDuration, | |||
| @@ -139,7 +139,7 @@ namespace Gaming | |||
| case GameObjType.Character: | |||
| if ((!((Character)objBeingShot).IsGhost()) && bullet.Parent.IsGhost()) | |||
| if (((Character)objBeingShot).BeAttacked(bullet)) | |||
| if (((Student)objBeingShot).BeAttacked(bullet)) | |||
| { | |||
| BeAddictedToGame((Student)objBeingShot); | |||
| } | |||
| @@ -81,22 +81,23 @@ | |||
| public enum PlayerStateType | |||
| { | |||
| Null = 0, | |||
| IsAddicted = 1, | |||
| IsEscaped = 2, | |||
| IsSwinging = 3,//指后摇 | |||
| IsDeceased = 4, | |||
| IsMoving = 5, | |||
| IsTreating = 6, | |||
| IsRescuing = 7, | |||
| IsFixing = 8, | |||
| IsTreated = 9, | |||
| IsRescued = 10, | |||
| IsStunned = 11, | |||
| IsTryingToAttack = 12,//指前摇 | |||
| IsLockingTheDoor = 13, | |||
| IsOpeningTheChest = 14, | |||
| IsClimbingThroughWindows = 15, | |||
| IsUsingSpecialSkill = 16, | |||
| Addicted = 1, | |||
| Escaped = 2, | |||
| Swinging = 3,//指后摇 | |||
| Deceased = 4, | |||
| Moving = 5, | |||
| Treating = 6, | |||
| Rescuing = 7, | |||
| Fixing = 8, | |||
| Treated = 9, | |||
| Rescued = 10, | |||
| Stunned = 11, | |||
| TryingToAttack = 12,//指前摇 | |||
| LockingOrOpeningTheDoor = 13, | |||
| OpeningTheChest = 14, | |||
| ClimbingThroughWindows = 15, | |||
| UsingSkill = 16, | |||
| OpeningTheDoorWay = 17, | |||
| } | |||
| ~~~ | |||
| - 可执行指令的(不用给选手) | |||
| @@ -174,22 +175,21 @@ | |||
| - 开启进度 | |||
| ### 紧急出口:物体 | |||
| - *是否显现* | |||
| - *是否打开* | |||
| - 是否显现 | |||
| - 是否打开 | |||
| ### 墙:物体 | |||
| ### 窗:物体 | |||
| - *正在翻窗的人* | |||
| - 正在翻窗的人 | |||
| ### 箱子:物体 | |||
| - *是否开启* | |||
| - *开箱进度* | |||
| - 开箱进度 | |||
| ### 门:物体 | |||
| - *属于那个教学区* | |||
| - *是否锁上* | |||
| - *开锁门进度* | |||
| - 属于那个教学区 | |||
| - 是否锁上 | |||
| - 开锁门进度 | |||
| - 不提供是否可以锁上的属性 | |||
| ### 电机(建议称为homework):物体 | |||
| @@ -205,14 +205,14 @@ | |||
| - 除了逃离和翻窗,交互目标与交互者在一个九宫格内则为可交互 | |||
| - 逃离时学生应当与出口在同一格子内 | |||
| - 翻窗时玩家应当在窗前后一个格子内 | |||
| - *在指令仍在进行时,重复发出同一类型的交互指令是无效的,你需要先发出Stop指令终止进行的指令* | |||
| - 在指令仍在进行时,重复发出同一类型的交互指令是无效的,你需要先发出Stop指令终止进行的指令 | |||
| ### 破译与逃脱 | |||
| - *每张地图都会刷新 9台电机,求生者需要破译其中的7台*,并开启任意一个大门后从任意一个开启的大门- 逃脱,亦或者在只剩1名求生者的情况下从紧急出口逃脱; | |||
| - 每张地图都会刷新 9台电机,求生者需要破译其中的7台,并开启任意一个大门后从任意一个开启的大门- 逃脱,亦或者在只剩1名求生者的情况下从紧急出口逃脱; | |||
| - 求生者和监管者在靠近电机时,可以看到电机的破译进度条。 | |||
| - 紧急出口会在电机破译完成3台的情况下在地图的3-5个固定紧急出口刷新点之一随机刷新。 | |||
| - 当求生者只剩1名时,紧急出口盖将会自动打开,该求生者可从紧急出口逃脱。 | |||
| - *开启大门所需时间为18秒。* | |||
| - 开启大门所需时间为18秒。 | |||
| - 大门开启的进度不清空 | |||
| - 一个大门同时最多可以由一人开启 | |||
| @@ -222,7 +222,7 @@ | |||
| - 无论搞蛋鬼或学生,攻击时,从播放攻击动作到可以开始产生伤害的期间,称为前摇。(前摇阶段,搞蛋鬼产生通常为不可爆炸(部分搞蛋鬼能可以产生可爆炸)子弹(爆炸范围=0),[子弹大小待商榷],期间监管者攻击被打断时,子弹消失)(无论近战远程均产生子弹) | |||
| - 无论搞蛋鬼或学生,攻击后,通常会出现一段无伤害判定的攻击动作后置时间,称为后摇。击中物体时后摇更长 | |||
| - *假如监管者攻击或一些监管者的特定技能击中正在交互的求生者,将使求生者眩晕* | |||
| - 假如监管者攻击或一些监管者的特定技能击中正在交互或处于攻击前后摇或使用部分技能(指PlayerState==UsingSkill)的求生者,将使求生者眩晕 | |||
| 1. 处于前摇或后摇 | |||
| 2. 治疗或解救他人 | |||
| 3. 修理电机 | |||