From 9d594f29648066f863f25c9bb6f4f1ef7d303ee9 Mon Sep 17 00:00:00 2001 From: shangfengh <3495281661@qq.com> Date: Wed, 22 Mar 2023 10:34:37 +0800 Subject: [PATCH] build: :construction: finish the Map --- logic/GameClass/GameObj/Map/Door.cs | 46 +++++++++++++++++++++++++++ logic/GameClass/GameObj/Map/Map.cs | 20 ++++++++++++ logic/GameClass/GameObj/Map/Window.cs | 43 ++++--------------------- logic/Gaming/ActionManager.cs | 20 +----------- logic/Server/CopyInfo.cs | 8 ++--- logic/规则Logic.md | 5 ++- 6 files changed, 80 insertions(+), 62 deletions(-) create mode 100644 logic/GameClass/GameObj/Map/Door.cs diff --git a/logic/GameClass/GameObj/Map/Door.cs b/logic/GameClass/GameObj/Map/Door.cs new file mode 100644 index 0000000..fd95768 --- /dev/null +++ b/logic/GameClass/GameObj/Map/Door.cs @@ -0,0 +1,46 @@ +using Preparation.Interface; +using Preparation.Utility; + +namespace GameClass.GameObj +{ + /// + /// 门 + /// + public class Door : GameObj + { + public Door(XY initPos, PlaceType placeType) : + base(initPos, GameData.numOfPosGridPerCell / 2, GameObjType.Door) + { + this.place = placeType; + this.CanMove = false; + } + public override bool IsRigid => true; + public override ShapeType Shape => ShapeType.Square; + protected override bool IgnoreCollideExecutor(IGameObj targetObj) + { + return isOpen; + } + + private bool isOpen = false; + public bool IsOpen + { + get => isOpen; + set + { + lock (gameObjLock) + isOpen = value; + } + } + + private int openOrLockDegree = 0; + public int OpenOrLockDegree + { + get => openOrLockDegree; + set + { + lock (gameObjLock) + openOrLockDegree = (value > 0) ? value : 0; + } + } + } +} diff --git a/logic/GameClass/GameObj/Map/Map.cs b/logic/GameClass/GameObj/Map/Map.cs index 98b079c..ed9d445 100644 --- a/logic/GameClass/GameObj/Map/Map.cs +++ b/logic/GameClass/GameObj/Map/Map.cs @@ -190,6 +190,26 @@ namespace GameClass.GameObj Add(new Chest(GameData.GetCellCenterPos(i, j))); break; } + case (uint)PlaceType.Door3: + { + Add(new Door(GameData.GetCellCenterPos(i, j), PlaceType.Door3)); + break; + } + case (uint)PlaceType.Door5: + { + Add(new Door(GameData.GetCellCenterPos(i, j), PlaceType.Door5)); + break; + } + case (uint)PlaceType.Door6: + { + Add(new Door(GameData.GetCellCenterPos(i, j), PlaceType.Door6)); + break; + } + case (uint)PlaceType.Window: + { + Add(new Window(GameData.GetCellCenterPos(i, j))); + break; + } case (uint)PlaceType.BirthPoint1: case (uint)PlaceType.BirthPoint2: case (uint)PlaceType.BirthPoint3: diff --git a/logic/GameClass/GameObj/Map/Window.cs b/logic/GameClass/GameObj/Map/Window.cs index 1d1e814..71690db 100644 --- a/logic/GameClass/GameObj/Map/Window.cs +++ b/logic/GameClass/GameObj/Map/Window.cs @@ -4,7 +4,7 @@ using Preparation.Utility; namespace GameClass.GameObj { /// - /// 出口 + /// 窗 /// public class Window : GameObj { @@ -18,50 +18,21 @@ namespace GameClass.GameObj public override ShapeType Shape => ShapeType.Square; protected override bool IgnoreCollideExecutor(IGameObj targetObj) { - if (targetObj.Type != GameObjType.Character) - return true; // 非玩家不碰撞 - else if (!((Character)targetObj).IsGhost()) - return true; // 不是鬼不碰撞 + if (targetObj == whoIsClimbing) + return true; return false; } - private bool powerSupply = false; - public bool PowerSupply + private Character? whoIsClimbing = null; + public Character? WhoIsClimbing { - get => powerSupply; + get => whoIsClimbing; set { lock (gameObjLock) - powerSupply = value; + whoIsClimbing = value; } } - private bool isOpening = false; - public bool IsOpening - { - get => isOpening; - set - { - lock (gameObjLock) - isOpening = value; - } - } - - private int openDegree = 0; - public int OpenDegree - { - get => openDegree; - set - { - if (value > 0) - lock (gameObjLock) - openDegree = (value < GameData.degreeOfOpenedDoorway) ? value : GameData.degreeOfOpenedDoorway; - else - lock (gameObjLock) - openDegree = 0; - } - } - - public bool IsOpen() => (OpenDegree == GameData.degreeOfOpenedDoorway); } } diff --git a/logic/Gaming/ActionManager.cs b/logic/Gaming/ActionManager.cs index 9372b5f..a62b3bc 100644 --- a/logic/Gaming/ActionManager.cs +++ b/logic/Gaming/ActionManager.cs @@ -288,25 +288,7 @@ namespace Gaming { if ((!player.Commandable()) || player.PlayerState == PlayerStateType.IsOpeningTheChest) return false; - Chest? chestToOpen = null; - - - gameMap.GameObjLockDict[GameObjType.Chest].EnterReadLock(); - try - { - foreach (Chest chest in gameMap.GameObjDict[GameObjType.Chest]) - { - if (GameData.ApproachToInteract(chest.Position, player.Position)) - { - chestToOpen = chest; - break; - } - } - } - finally - { - gameMap.GameObjLockDict[GameObjType.Chest].ExitReadLock(); - } + Chest? chestToOpen = (Chest?)gameMap.OneForInteract(player.Position, GameObjType.Chest); if (chestToOpen == null || chestToOpen.IsOpen) return false; diff --git a/logic/Server/CopyInfo.cs b/logic/Server/CopyInfo.cs index 43771d6..5072caf 100644 --- a/logic/Server/CopyInfo.cs +++ b/logic/Server/CopyInfo.cs @@ -203,8 +203,8 @@ namespace Server for (int i = 0; i < GameData.maxNumOfSkill - player.TimeUntilActiveSkillAvailable.Count(); ++i) msg.StudentMessage.TimeUntilSkillAvailable.Add(-1); - foreach (var Value in player.PropInventory) - msg.StudentMessage.Prop.Add(ToPropType(Value.GetPropType())); + foreach (var value in player.PropInventory) + msg.StudentMessage.Prop.Add(ToPropType(value.GetPropType())); msg.StudentMessage.Place = ToPlaceType(player.Place); msg.StudentMessage.Guid = player.ID; @@ -247,8 +247,8 @@ namespace Server msg.StudentMessage.TimeUntilSkillAvailable.Add(-1); msg.TrickerMessage.Place = ToPlaceType(player.Place); - foreach (var Value in player.PropInventory) - msg.StudentMessage.Prop.Add(ToPropType(Value.GetPropType())); + foreach (var value in player.PropInventory) + msg.StudentMessage.Prop.Add(ToPropType(value.GetPropType())); msg.TrickerMessage.TrickerType = ToTrickerType(player.CharacterType); msg.TrickerMessage.Guid = player.ID; diff --git a/logic/规则Logic.md b/logic/规则Logic.md index 41f5f82..19fb557 100644 --- a/logic/规则Logic.md +++ b/logic/规则Logic.md @@ -28,7 +28,7 @@ - 只展示外部需要的属性,部分属性被省略 ### BgmType -- 枚举类BgmType +- *枚举类BgmType* 1. 不详的感觉:监管者进入(求生者的警戒半径/监管者的隐蔽度)时,求生者收到;监管者距离求生者越近,Bgm音量越大。bgmVolume=(警戒半径/二者距离) 2. 期待搞事的感觉:求生者进入(监管者的警戒半径/求生者的隐蔽度)时,监管者收到;监管者距离求生者越近,Bgm音量越大。bgmVolume=(警戒半径/可被发觉的最近的求生者距离) 3. 修理电机的声音: 监管者警戒半径内有电机正在被修理时收到;bgmVolume=(警戒半径*电机修理程度/二者距离)/10300000 @@ -135,7 +135,7 @@ - 沉迷游戏程度 - 最大沉迷游戏程度 - 被治疗程度 -- *(去)救援(别人)程度* +- *被救援程度* ### 搞蛋鬼:人物 无 @@ -186,7 +186,6 @@ ### 箱子:物体 - *是否开启* - *开箱进度* -- *是否正在被开启* ### 门:物体 - *属于那个教学区*