|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- using Preparation.Interface;
- using Preparation.Utility;
- using System;
- using System.Threading;
-
- namespace GameClass.GameObj
- {
- /// <summary>
- /// 门
- /// </summary>
- 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 => Interlocked.CompareExchange(ref lockDegree, -1, -1);
- }
- public int AddLockDegree(int add)
- {
- return Interlocked.Add(ref lockDegree, add);
- }
-
- private long openStartTime = 0;
- public long OpenStartTime
- {
- get
- {
- lock (gameObjLock)
- return openStartTime;
- }
- }
-
- public bool TryOpen(Character character)
- {
- lock (gameObjLock)
- {
- if (isOpen) return false;
- if (whoLockOrOpen != null) return false;
- openStartTime = Environment.TickCount64;
- whoLockOrOpen = character;
- return true;
- }
- }
- public void StopOpen()
- {
- lock (gameObjLock)
- {
- if (whoLockOrOpen != null)
- {
- if ((Environment.TickCount64 - openStartTime) >= GameData.degreeOfLockingOrOpeningTheDoor / whoLockOrOpen.SpeedOfOpeningOrLocking)
- //现在框架没有问题,但是调用可变的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;
- Interlocked.Exchange(ref 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();
- }
- }
- }
- }
- }
- }
|