using Preparation.Interface; using Preparation.Utility; using System; using System.Threading; namespace GameClass.GameObj { /// /// 门 /// public class Door : Immovable { public Door(XY initPos, PlaceType placeType) : base(initPos, GameData.numOfPosGridPerCell / 2, GameObjType.Door) { switch (placeType) { case PlaceType.Door3: doorNum = 3; break; case PlaceType.Door5: doorNum = 5; break; case PlaceType.Door6: default: doorNum = 6; break; } } private readonly int doorNum; public int DoorNum => doorNum; public override bool IsRigid => !isOpen; public override ShapeType Shape => ShapeType.Square; private Character? whoLockOrOpen = null; public Character? WhoLockOrOpen { get { lock (gameObjLock) return whoLockOrOpen; } } private bool isOpen = true; public bool IsOpen { get { lock (gameObjLock) return isOpen; } } private int lockDegree = 0; public int LockDegree { get { lock (gameObjLock) return lockDegree; } set { value = (value > GameData.degreeOfLockingOrOpeningTheDoor) ? GameData.degreeOfLockingOrOpeningTheDoor : value; lock (gameObjLock) lockDegree = value; } } private int openStartTime = 0; public int OpenStartTime { get { lock (gameObjLock) return openStartTime; } } public bool TryOpen(Character character) { lock (gameObjLock) { if (isOpen) return false; if (whoLockOrOpen != null) return false; openStartTime = Environment.TickCount; whoLockOrOpen = character; return true; } } public void StopOpen() { lock (gameObjLock) { if (whoLockOrOpen != null) { if ((Environment.TickCount - openStartTime) >= GameData.degreeOfLockingOrOpeningTheDoor / whoLockOrOpen.SpeedOfOpeningOrLocking) isOpen = true; whoLockOrOpen = null; } } } public void FinishOpen() { lock (gameObjLock) { isOpen = true; whoLockOrOpen = null; } } public bool TryLock(Character character) { lock (gameObjLock) { if (!isOpen) return false; if (whoLockOrOpen != null) return false; lockDegree = 0; whoLockOrOpen = character; return true; } } public void StopLock() { lock (gameObjLock) { if (lockDegree >= GameData.degreeOfLockingOrOpeningTheDoor) isOpen = false; whoLockOrOpen = null; } } public void FinishLock() { lock (gameObjLock) { isOpen = false; whoLockOrOpen = null; } } public void ForceToOpen() { Character? character; lock (gameObjLock) { character = whoLockOrOpen; whoLockOrOpen = null; isOpen = true; } if (character != null) { lock (character.ActionLock) { if (character.PlayerState == PlayerStateType.OpeningTheDoor) { character.ReleaseTool(DoorNum switch { 3 => PropType.Key3, 5 => PropType.Key5, _ => PropType.Key6, }); character.SetPlayerStateNaturally(); } else if (character.PlayerState == PlayerStateType.LockingTheDoor) { character.SetPlayerStateNaturally(); } } } } } }