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 @@
### 箱子:物体
- *是否开启*
- *开箱进度*
-- *是否正在被开启*
### 门:物体
- *属于那个教学区*