From 9e5f599bd662f1f7117fbf12e22d050b723891e3 Mon Sep 17 00:00:00 2001 From: shangfengh <3495281661@qq.com> Date: Thu, 27 Apr 2023 20:04:45 +0800 Subject: [PATCH 01/29] fix: :bug: fix the bug about return value when using skill --- docs/CAPI接口(cpp).md | 2 +- docs/CAPI接口(python).md | 2 +- docs/GameRules.md | 1 + docs/QandA.md | 2 +- logic/GameClass/GameObj/Map/Map.cs | 32 +++++++++++++++---- logic/Gaming/SkillManager/SkillManager.cs | 39 ++++++++--------------- logic/Server/RpcServices.cs | 1 - 7 files changed, 42 insertions(+), 37 deletions(-) diff --git a/docs/CAPI接口(cpp).md b/docs/CAPI接口(cpp).md index b427644..bc7dac5 100644 --- a/docs/CAPI接口(cpp).md +++ b/docs/CAPI接口(cpp).md @@ -59,7 +59,7 @@ 下面的 CellX 和 CellY 指的是地图格数,而非绝对坐标。 - `THUAI6::PlaceType GetPlaceType(int32_t cellX, int32_t cellY)` :返回某一位置场地种类信息。场地种类详见 structure.h 。 - - 以下指令,若查询物品当前在视野内,则返回最新进度;若物品当前不在视野内、但曾经出现在视野内,则返回最后一次看到时的进度;若物品从未出现在视野内,或查询位置没有对应的物品,则返回 -1。 + - 以下指令,若查询物品当前在视野内,则返回最新进度/状态;若物品当前不在视野内、但曾经出现在视野内,则返回最后一次看到时的进度/状态;若物品从未出现在视野内,或查询位置没有对应的物品,则返回 -1。 - `int32_t GetChestProgress(int32_t cellX, int32_t cellY) const`:查询特定位置箱子开启进度 - `int32_t GetGateProgress(int32_t cellX, int32_t cellY) const`:查询特定位置校门开启进度 - `int32_t GetClassroomProgress(int32_t cellX, int32_t cellY) const`:查询特定位置教室作业完成进度 diff --git a/docs/CAPI接口(python).md b/docs/CAPI接口(python).md index 500da59..a2f53e4 100644 --- a/docs/CAPI接口(python).md +++ b/docs/CAPI接口(python).md @@ -72,7 +72,7 @@ 下面的 CellX 和 CellY 指的是地图格数,而非绝对坐标。 - `def GetPlaceType(self, cellX: int, cellY: int) -> THUAI6.PlaceType` :返回某一位置场地种类信息。场地种类详见 structure.h 。 - - 以下指令,若查询物品当前在视野内,则返回最新进度;若物品当前不在视野内、但曾经出现在视野内,则返回最后一次看到时的进度;若物品从未出现在视野内,或查询位置没有对应的物品,则返回 -1。 + - 以下指令,若查询物品当前在视野内,则返回最新进度/状态;若物品当前不在视野内、但曾经出现在视野内,则返回最后一次看到时的进度/状态;若物品从未出现在视野内,或查询位置没有对应的物品,则返回 -1。 - `def GetChestProgress(self, cellX: int, cellY: int) -> int`:查询特定位置箱子开启进度 - `def GetGateProgress(self, cellX: int, cellY: int) -> int`:查询特定位置校门开启进度 - `def GetClassroomProgress(self, cellX: int, cellY: int) -> int`:查询特定位置教室作业完成进度 diff --git a/docs/GameRules.md b/docs/GameRules.md index c88870f..6bcc9c1 100644 --- a/docs/GameRules.md +++ b/docs/GameRules.md @@ -364,6 +364,7 @@ $$ ### 技能 - CD冷却计时是在开始使用技能的瞬间开始的 - Klee的小炸弹有碰撞体积 +- 除了切换攻击类型的技能,在不能执行指令的状态下(包括翻窗)均不能使用技能 ### 职业 - 学生职业可以重复选择 \ No newline at end of file diff --git a/docs/QandA.md b/docs/QandA.md index 6995cec..a190c91 100644 --- a/docs/QandA.md +++ b/docs/QandA.md @@ -80,4 +80,4 @@ A:初赛结束会调数值及机制,增加新角色 Q:初赛后会修改什么呢? -A:技能冷却时间等属性设为不可见;出生点随机性或可选性;增强教师等职业,削弱职业;规范Debug信息;提供不同格式的信息传递;增加职业;优化游戏结束条件 \ No newline at end of file +A:技能冷却时间等属性设为不可见;出生点随机性或可选性;增强教师等职业,削弱职业;规范Debug信息;提供不同格式的信息传递;增加职业;优化游戏结束条件;角色毅力值清空不在使捣蛋鬼产生BGM \ No newline at end of file diff --git a/logic/GameClass/GameObj/Map/Map.cs b/logic/GameClass/GameObj/Map/Map.cs index 427c76d..96b0f15 100644 --- a/logic/GameClass/GameObj/Map/Map.cs +++ b/logic/GameClass/GameObj/Map/Map.cs @@ -13,29 +13,47 @@ namespace GameClass.GameObj private readonly Dictionary birthPointList; // 出生点列表 public Dictionary BirthPointList => birthPointList; - private object lockForNum = new(); + private readonly object lockForNum = new(); private void WhenStudentNumChange() { if (numOfDeceasedStudent + numOfEscapedStudent == GameData.numOfStudent) { Timer.IsGaming = false; + return; } - if (GameData.numOfStudent - NumOfDeceasedStudent - NumOfEscapedStudent == 1) + if (GameData.numOfStudent - numOfDeceasedStudent - numOfEscapedStudent == 1) { - GameObjLockDict[GameObjType.EmergencyExit].EnterWriteLock(); + GameObjLockDict[GameObjType.Character].EnterReadLock(); try { - foreach (EmergencyExit emergencyExit in GameObjDict[GameObjType.EmergencyExit]) - if (emergencyExit.CanOpen) + foreach (Character player in GameObjDict[GameObjType.Character]) + if (player.PlayerState==PlayerStateType.Addicted) { - emergencyExit.IsOpen = true; + Timer.IsGaming = false; break; } } finally { - GameObjLockDict[GameObjType.EmergencyExit].ExitWriteLock(); + GameObjLockDict[GameObjType.Character].ExitReadLock(); + } + if (!Timer.IsGaming) + { + GameObjLockDict[GameObjType.EmergencyExit].EnterWriteLock(); + try + { + foreach (EmergencyExit emergencyExit in GameObjDict[GameObjType.EmergencyExit]) + if (emergencyExit.CanOpen) + { + emergencyExit.IsOpen = true; + break; + } + } + finally + { + GameObjLockDict[GameObjType.EmergencyExit].ExitWriteLock(); + } } } } diff --git a/logic/Gaming/SkillManager/SkillManager.cs b/logic/Gaming/SkillManager/SkillManager.cs index 9cf6f09..59fc7e3 100644 --- a/logic/Gaming/SkillManager/SkillManager.cs +++ b/logic/Gaming/SkillManager/SkillManager.cs @@ -17,44 +17,31 @@ namespace Gaming switch (activeSkillType) { case ActiveSkillType.BecomeInvisible: - BecomeInvisible(character); - break; + return BecomeInvisible(character); case ActiveSkillType.UseKnife: - UseKnife(character); - break; + return UseKnife(character); case ActiveSkillType.Howl: - Howl(character); - break; + return Howl(character); case ActiveSkillType.CanBeginToCharge: - CanBeginToCharge(character); - break; + return CanBeginToCharge(character); case ActiveSkillType.Inspire: - Inspire(character); - break; + return Inspire(character); case ActiveSkillType.Encourage: - Encourage(character); - break; + return Encourage(character); case ActiveSkillType.Punish: - Punish(character); - break; + return Punish(character); case ActiveSkillType.JumpyBomb: - JumpyBomb(character); - break; + return JumpyBomb(character); case ActiveSkillType.WriteAnswers: - WriteAnswers(character); - break; + return WriteAnswers(character); case ActiveSkillType.SummonGolem: - SummonGolem(character); - break; + return SummonGolem(character); case ActiveSkillType.UseRobot: - UseRobot(character); - break; + return UseRobot(character); case ActiveSkillType.Rouse: - Rouse(character); - break; + return Rouse(character); case ActiveSkillType.ShowTime: - ShowTime(character); - break; + return ShowTime(character); default: return false; } diff --git a/logic/Server/RpcServices.cs b/logic/Server/RpcServices.cs index cac7984..f8f3fe4 100644 --- a/logic/Server/RpcServices.cs +++ b/logic/Server/RpcServices.cs @@ -1,7 +1,6 @@ using Grpc.Core; using Protobuf; using System.Threading; -using Timothy.FrameRateTask; using System; using System.Net.Http.Headers; using Gaming; From 13ee3dab31c906b3d4c03305b170f838a7cea6d0 Mon Sep 17 00:00:00 2001 From: shangfengh <3495281661@qq.com> Date: Thu, 27 Apr 2023 21:52:32 +0800 Subject: [PATCH 02/29] style: :art: fix the problem --- docs/GameRules.md | 3 ++- logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs | 1 - logic/GameClass/GameObj/Map/Map.cs | 5 ++--- logic/GameEngine/CollisionChecker.cs | 1 - logic/Gaming/AttackManager.cs | 1 - 5 files changed, 4 insertions(+), 7 deletions(-) diff --git a/docs/GameRules.md b/docs/GameRules.md index 6bcc9c1..80cb1f1 100644 --- a/docs/GameRules.md +++ b/docs/GameRules.md @@ -64,7 +64,7 @@ CellX=\frac{x}{1000},CellY=\frac{y}{1000} $$ - 格子有对应区域类型:陆地、墙、草地、教室、校门、隐藏校门、门、窗、箱子 -- 隐藏校门刷新点的区域类型始终为隐藏校门 +- 任何格子的区域类型(PlaceType)始终不变,所有隐藏校门刷新点的区域类型均为隐藏校门 ### 人物 - 人物直径为800 @@ -360,6 +360,7 @@ $$ ### 信息相关 - Bgm在没有符合条件的情况下,值为0。 + - 不能给自己发信息 ### 技能 - CD冷却计时是在开始使用技能的瞬间开始的 diff --git a/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs b/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs index 672e40f..2b3df5c 100644 --- a/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs +++ b/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs @@ -1,6 +1,5 @@ using Preparation.Interface; using Preparation.Utility; -using System; namespace GameClass.GameObj { diff --git a/logic/GameClass/GameObj/Map/Map.cs b/logic/GameClass/GameObj/Map/Map.cs index 96b0f15..953ddb3 100644 --- a/logic/GameClass/GameObj/Map/Map.cs +++ b/logic/GameClass/GameObj/Map/Map.cs @@ -3,7 +3,6 @@ using System.Threading; using Preparation.Interface; using Preparation.Utility; using System; -using GameClass.GameObj; namespace GameClass.GameObj { @@ -28,7 +27,7 @@ namespace GameClass.GameObj try { foreach (Character player in GameObjDict[GameObjType.Character]) - if (player.PlayerState==PlayerStateType.Addicted) + if (player.PlayerState == PlayerStateType.Addicted) { Timer.IsGaming = false; break; @@ -38,7 +37,7 @@ namespace GameClass.GameObj { GameObjLockDict[GameObjType.Character].ExitReadLock(); } - if (!Timer.IsGaming) + if (Timer.IsGaming) { GameObjLockDict[GameObjType.EmergencyExit].EnterWriteLock(); try diff --git a/logic/GameEngine/CollisionChecker.cs b/logic/GameEngine/CollisionChecker.cs index 046d5bc..1a7a2e3 100644 --- a/logic/GameEngine/CollisionChecker.cs +++ b/logic/GameEngine/CollisionChecker.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Numerics; using System.Threading; using Preparation.Interface; using Preparation.Utility; diff --git a/logic/Gaming/AttackManager.cs b/logic/Gaming/AttackManager.cs index e86e429..0db4748 100644 --- a/logic/Gaming/AttackManager.cs +++ b/logic/Gaming/AttackManager.cs @@ -6,7 +6,6 @@ using Preparation.Utility; using GameEngine; using Preparation.Interface; using Timothy.FrameRateTask; -using System.Numerics; namespace Gaming { From 4ecaefd567879455a5274367008652876040b5fa Mon Sep 17 00:00:00 2001 From: Shawqeem <1004837646@qq.com> Date: Thu, 27 Apr 2023 22:14:19 +0800 Subject: [PATCH 03/29] fix: :bug: fix the bug that map is not refreshed at the start and that map is always flickering fix the bug that map is not refreshed at the start and that map is always flickering --- logic/Client/MainWindow.xaml | 3 +- logic/Client/MainWindow.xaml.cs | 118 +++++++++++++------------------- logic/cmd/PlaybackServer.cmd | 6 +- 3 files changed, 51 insertions(+), 76 deletions(-) diff --git a/logic/Client/MainWindow.xaml b/logic/Client/MainWindow.xaml index beacab5..e1326a7 100644 --- a/logic/Client/MainWindow.xaml +++ b/logic/Client/MainWindow.xaml @@ -5,7 +5,8 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Client" mc:Ignorable="d" - Title="ClientVI" Height="738" Width="850" KeyDown="KeyBoardControl" Background="White" ResizeMode="CanResizeWithGrip" WindowStyle="None" MouseLeftButtonDown="DragWindow" MouseDoubleClick="Attack" MinHeight="738" MinWidth="1100"> + Title="ClientVI" Height="738" Width="850" KeyDown="KeyBoardControl" Background="White" ResizeMode="CanResizeWithGrip" WindowStyle="None" MouseLeftButtonDown="DragWindow" MouseDoubleClick="Attack" MinHeight="738" MinWidth="1100" + SizeChanged="ZoomMap"> diff --git a/logic/Client/MainWindow.xaml.cs b/logic/Client/MainWindow.xaml.cs index 4ab6665..340fbd4 100644 --- a/logic/Client/MainWindow.xaml.cs +++ b/logic/Client/MainWindow.xaml.cs @@ -34,8 +34,6 @@ namespace Client { public MainWindow() { - unitHeight = unitWidth = unit = 13; - bonusflag = true; timer = new DispatcherTimer { Interval = new TimeSpan(50000) // 每50ms刷新一次 @@ -60,6 +58,10 @@ namespace Client listOfGate = new List(); listOfHiddenGate = new List(); WindowStartupLocation = WindowStartupLocation.CenterScreen; + unit = Math.Sqrt(UpperLayerOfMap.ActualHeight * UpperLayerOfMap.ActualWidth) / 50; + unitFontsize = unit / 13; + unitHeight = UpperLayerOfMap.ActualHeight / 50; + unitWidth = UpperLayerOfMap.ActualWidth / 50; ReactToCommandline(); } @@ -194,6 +196,7 @@ namespace Client 0 => PlayerType.NullPlayerType, 1 => PlayerType.StudentPlayer, 2 => PlayerType.TrickerPlayer, + _ => PlayerType.NullPlayerType }; playerMsg.PlayerType = playerType; if (Convert.ToInt64(comInfo[3]) == 1) @@ -268,9 +271,9 @@ namespace Client { TextBox icon = new() { - FontSize = 10, - Width = 20, - Height = 20, + FontSize = 7 * unitFontsize, + Width = unitWidth, + Height = unitHeight, Text = text, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, @@ -282,37 +285,23 @@ namespace Client UpperLayerOfMap.Children.Add(icon); } - private void ZoomMap() - { - for (int i = 0; i < 50; i++) - { - for (int j = 0; j < 50; j++) - { - if (mapPatches[i, j] != null && (mapPatches[i, j].Width != UpperLayerOfMap.ActualWidth / 50 || mapPatches[i, j].Height != UpperLayerOfMap.ActualHeight / 50)) - { - mapPatches[i, j].Width = UpperLayerOfMap.ActualWidth / 50; - mapPatches[i, j].Height = UpperLayerOfMap.ActualHeight / 50; - mapPatches[i, j].HorizontalAlignment = HorizontalAlignment.Left; - mapPatches[i, j].VerticalAlignment = VerticalAlignment.Top; - mapPatches[i, j].Margin = new Thickness(UpperLayerOfMap.ActualWidth / 50 * j, UpperLayerOfMap.ActualHeight / 50 * i, 0, 0); - } - } - } - } - - private void ZoomMapAtFirst() + private void ZoomMap(object sender, SizeChangedEventArgs e) { + unit = Math.Sqrt(UpperLayerOfMap.ActualHeight * UpperLayerOfMap.ActualWidth) / 50; + unitFontsize = unit / 13; + unitHeight = UpperLayerOfMap.ActualHeight / 50; + unitWidth = UpperLayerOfMap.ActualWidth / 50; for (int i = 0; i < 50; i++) { for (int j = 0; j < 50; j++) { if (mapPatches[i, j] != null) { - mapPatches[i, j].Width = UpperLayerOfMap.ActualWidth / 50; - mapPatches[i, j].Height = UpperLayerOfMap.ActualHeight / 50; + mapPatches[i, j].Width = unitWidth; + mapPatches[i, j].Height = unitHeight; mapPatches[i, j].HorizontalAlignment = HorizontalAlignment.Left; mapPatches[i, j].VerticalAlignment = VerticalAlignment.Top; - mapPatches[i, j].Margin = new Thickness(UpperLayerOfMap.ActualWidth / 50 * j, UpperLayerOfMap.ActualHeight / 50 * i, 0, 0); + mapPatches[i, j].Margin = new Thickness(unitWidth * j, unitHeight * i, 0, 0); } } } @@ -330,7 +319,7 @@ namespace Client Height = unitHeight, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, - Margin = new Thickness(Width * (j), Height * (i), 0, 0) + Margin = new Thickness(unitWidth * j, unitHeight * i, 0, 0)//unitWidth cannot be replaced by Width }; switch (defaultMap[i, j]) { @@ -697,7 +686,7 @@ namespace Client MaxButton.Content = "🗖"; foreach (var obj in listOfHuman) { - if (obj.PlayerId < GameData.numOfStudent && obj.StudentType != StudentType.Robot) + if (!isDataFixed[obj.PlayerId] && obj.PlayerId < GameData.numOfStudent && obj.StudentType != StudentType.Robot) { IStudentType occupation = (IStudentType)OccupationFactory.FindIOccupation(Transformation.ToStudentType(obj.StudentType)); totalLife[obj.PlayerId] = occupation.MaxHp; @@ -709,60 +698,52 @@ namespace Client coolTime[i, obj.PlayerId] = iActiveSkill.SkillCD; ++i; } + isDataFixed[obj.PlayerId] = true; } } foreach (var obj in listOfButcher) { - IGhostType occupation1 = (IGhostType)OccupationFactory.FindIOccupation(Transformation.ToTrickerType(obj.TrickerType)); - int j = 0; - foreach (var skill in occupation1.ListOfIActiveSkill) + if (!isDataFixed[obj.PlayerId]) { - var iActiveSkill = SkillFactory.FindIActiveSkill(skill); - coolTime[j, GameData.numOfStudent] = iActiveSkill.SkillCD; - ++j; + IGhostType occupation1 = (IGhostType)OccupationFactory.FindIOccupation(Transformation.ToTrickerType(obj.TrickerType)); + int j = 0; + foreach (var skill in occupation1.ListOfIActiveSkill) + { + var iActiveSkill = SkillFactory.FindIActiveSkill(skill); + coolTime[j, GameData.numOfStudent] = iActiveSkill.SkillCD; + ++j; + } + isDataFixed[obj.PlayerId] = true; } } if (StatusBarsOfSurvivor != null) { for (int i = 0; i < GameData.numOfStudent; i++) { - StatusBarsOfSurvivor[i].SetFontSize(12 * UpperLayerOfMap.ActualHeight / 650); StatusBarsOfSurvivor[i].NewData(totalLife, totalDeath, coolTime); } } if (StatusBarsOfHunter != null) { - StatusBarsOfHunter.SetFontSize(12 * UpperLayerOfMap.ActualHeight / 650); StatusBarsOfHunter.NewData(totalLife, totalDeath, coolTime); } - if (StatusBarsOfCircumstance != null) - StatusBarsOfCircumstance.SetFontSize(12 * UpperLayerOfMap.ActualHeight / 650); // 完成窗口信息更新 + if (StatusBarsOfSurvivor != null) + { + for (int i = 0; i < GameData.numOfStudent; i++) + { + StatusBarsOfSurvivor[i].SetFontSize(12 * unitFontsize); + } + } + if (StatusBarsOfHunter != null) + StatusBarsOfHunter.SetFontSize(12 * unitFontsize); + if (StatusBarsOfCircumstance != null) + StatusBarsOfCircumstance.SetFontSize(12 * unitFontsize); if (!isClientStocked) { - unit = Math.Sqrt(UpperLayerOfMap.ActualHeight * UpperLayerOfMap.ActualWidth) / 50; - unitHeight = UpperLayerOfMap.ActualHeight / 50; - unitWidth = UpperLayerOfMap.ActualWidth / 50; try { - // if (log != null) - //{ - // string temp = ""; - // for (int i = 0; i < dataDict[GameObjType.Character].Count; i++) - // { - // temp += Convert.ToString(dataDict[GameObjType.Character][i].MessageOfCharacter.TeamID) + "\n"; - // } - // log.Content = temp; - // } UpperLayerOfMap.Children.Clear(); - // if ((communicator == null || !communicator.Client.IsConnected) && !isPlaybackMode) - //{ - // UnderLayerOfMap.Children.Clear(); - // throw new Exception("Client is unconnected."); - // } - // else - //{ - foreach (var data in listOfAll) { StatusBarsOfCircumstance.SetValue(data, gateOpened, isEmergencyDrawed, isEmergencyOpened, playerID, isPlaybackMode); @@ -770,7 +751,6 @@ namespace Client if (!hasDrawed && mapFlag) { DrawMap(); - ZoomMapAtFirst(); } foreach (var data in listOfHuman) { @@ -791,7 +771,7 @@ namespace Client icon.Fill = Brushes.Gray; TextBox num = new() { - FontSize = 7 * UpperLayerOfMap.ActualHeight / 650, + FontSize = 7 * unitFontsize, Width = 2 * radiusTimes * unitWidth, Height = 2 * radiusTimes * unitHeight, Text = Convert.ToString(data.PlayerId), @@ -943,7 +923,7 @@ namespace Client int deg = (int)(100.0 * data.Progress / Preparation.Utility.GameData.degreeOfFixedGenerator); TextBox icon = new() { - FontSize = 8 * UpperLayerOfMap.ActualHeight / 650, + FontSize = 8 * unitFontsize, Width = unitWidth, Height = unitHeight, Text = Convert.ToString(deg), @@ -965,7 +945,7 @@ namespace Client int deg = (int)(100.0 * data.Progress / Preparation.Utility.GameData.degreeOfOpenedChest); TextBox icon = new() { - FontSize = 8 * UpperLayerOfMap.ActualHeight / 650, + FontSize = 8 * unitFontsize, Width = unitWidth, Height = unitHeight, Text = Convert.ToString(deg), @@ -987,7 +967,7 @@ namespace Client int deg = (int)(100.0 * data.Progress / Preparation.Utility.GameData.degreeOfOpenedDoorway); TextBox icon = new() { - FontSize = 8 * UpperLayerOfMap.ActualHeight / 650, + FontSize = 8 * unitFontsize, Width = unitWidth, Height = unitHeight, Text = Convert.ToString(deg), @@ -1009,7 +989,7 @@ namespace Client { TextBox icon = new() { - FontSize = 9 * UpperLayerOfMap.ActualHeight / 650, + FontSize = 9 * unitFontsize, Width = unitWidth, Height = unitHeight, HorizontalAlignment = HorizontalAlignment.Left, @@ -1042,7 +1022,7 @@ namespace Client isEmergencyOpened = true; TextBox icon = new() { - FontSize = 9 * UpperLayerOfMap.ActualHeight / 650, + FontSize = 9 * unitFontsize, Width = unitWidth, Height = unitHeight, Text = Convert.ToString("🔓"), @@ -1056,8 +1036,6 @@ namespace Client UpperLayerOfMap.Children.Add(icon); } } - //} - ZoomMap(); } catch (Exception exc) { @@ -1440,7 +1418,6 @@ namespace Client private MessageOfTricker? butcher = null; private bool humanOrButcher;//true for human - private bool bonusflag; private bool mapFlag = false; private bool hasDrawed = false; public int[,] defaultMap = new int[,] { @@ -1502,7 +1479,8 @@ namespace Client bool isSpectatorMode = false; bool isEmergencyOpened = false; bool isEmergencyDrawed = false; - bool isDataFixed = false; + bool[] isDataFixed = new bool[5] { false, false, false, false, false }; + double unitFontsize = 10; const double radiusTimes = 1.0 * Preparation.Utility.GameData.characterRadius / Preparation.Utility.GameData.numOfPosGridPerCell; const double bulletRadiusTimes = 1.0 * GameData.bulletRadius / Preparation.Utility.GameData.numOfPosGridPerCell; private int[] totalLife = new int[4] { 100, 100, 100, 100 }, totalDeath = new int[4] { 100, 100, 100, 100 }; diff --git a/logic/cmd/PlaybackServer.cmd b/logic/cmd/PlaybackServer.cmd index c3dd0bb..916c9ea 100644 --- a/logic/cmd/PlaybackServer.cmd +++ b/logic/cmd/PlaybackServer.cmd @@ -1,6 +1,2 @@ @echo off -::start cmd /k ..\Server\bin\Debug\net6.0\Server.exe --ip 0.0.0.0 --port 8888 --studentCount 4 --trickerCount 1 --gameTimeInSecond 600 --fileName test --playback true - -ping -n 2 127.0.0.1 > NUL - -start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --characterID 2030 \ No newline at end of file +start cmd /k ..\Server\bin\Debug\net6.0\Server.exe --port 8888 --fileName .\ladder1.thuaipb --playback --playbackSpeed 4.0 From 645373ae4d4cc174f67f03de81541675f2707770 Mon Sep 17 00:00:00 2001 From: gsy1519 <614054460@qq.com> Date: Thu, 27 Apr 2023 22:20:29 +0800 Subject: [PATCH 04/29] fix: :bug: spectator now can get mapMsg when isgaming --- logic/Server/PlaybackServer.cs | 72 ++++++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 12 deletions(-) diff --git a/logic/Server/PlaybackServer.cs b/logic/Server/PlaybackServer.cs index 1506b97..449c1ed 100644 --- a/logic/Server/PlaybackServer.cs +++ b/logic/Server/PlaybackServer.cs @@ -5,6 +5,7 @@ using System.Threading; using Timothy.FrameRateTask; using Gaming; using Grpc.Core; +using System.Collections.Concurrent; namespace Server { @@ -12,13 +13,31 @@ namespace Server { protected readonly ArgumentOptions options; private int[,] teamScore; - private Dictionary semaDict = new(); + private ConcurrentDictionary semaDict = new(); private object semaDictLock = new(); private MessageToClient? currentGameInfo = new(); + private MessageOfObj currentMapMsg = new(); private uint spectatorMinPlayerID = 2023; private List spectatorList = new List(); public int TeamCount => options.TeamCount; private MessageWriter? mwr = null; + private object spetatorJoinLock = new(); + protected object spectatorLock = new object(); + protected bool isSpectatorJoin = false; + protected bool IsSpectatorJoin + { + get + { + lock (spectatorLock) + return isSpectatorJoin; + } + + set + { + lock (spectatorLock) + isSpectatorJoin = value; + } + } private bool IsGaming { get; set; } private int[] finalScore; public int[] FinalScore @@ -38,18 +57,20 @@ namespace Server public override async Task AddPlayer(PlayerMsg request, IServerStreamWriter responseStream, ServerCallContext context) { - if (request.PlayerId >= spectatorMinPlayerID) + if (request.PlayerId >= spectatorMinPlayerID && options.NotAllowSpectator == false) { // 观战模式 - uint tp = (uint)request.PlayerId; - if (!spectatorList.Contains(tp)) + lock (spetatorJoinLock) // 具体原因见另一个上锁的地方 { - spectatorList.Add(tp); - Console.WriteLine("A new spectator comes to watch this game."); - var temp = (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1)); - lock (semaDictLock) + if (semaDict.TryAdd(request.PlayerId, (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1)))) + { + Console.WriteLine("A new spectator comes to watch this game."); + IsSpectatorJoin = true; + } + else { - semaDict.Add(request.PlayerId, temp); + Console.WriteLine($"Duplicated Spectator ID {request.PlayerId}"); + return; } } do @@ -63,15 +84,32 @@ namespace Server //Console.WriteLine("Send!"); } } + catch (InvalidOperationException) + { + if (semaDict.TryRemove(request.PlayerId, out var semas)) + { + try + { + semas.Item1.Release(); + semas.Item2.Release(); + } + catch { } + Console.WriteLine($"The spectator {request.PlayerId} exited"); + } + } catch (Exception) { - //Console.WriteLine(ex); + // Console.WriteLine(ex); } finally { - semaDict[request.PlayerId].Item2.Release(); + try + { + semaDict[request.PlayerId].Item2.Release(); + } + catch { } } - } while (IsGaming == true); + } while (IsGaming); return; } } @@ -79,6 +117,16 @@ namespace Server public void ReportGame(MessageToClient? msg) { currentGameInfo = msg; + if (currentGameInfo != null && currentGameInfo.GameState == GameState.GameStart) + { + currentMapMsg = currentGameInfo.ObjMessage[0]; + } + + if (currentGameInfo != null && IsSpectatorJoin) + { + currentGameInfo.ObjMessage.Add(currentMapMsg); + IsSpectatorJoin = false; + } foreach (var kvp in semaDict) { From d5165044295aaf5fd1919f9eff665e48f16ee650 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 27 Apr 2023 23:19:29 +0800 Subject: [PATCH 05/29] chore: add lock even before starting --- logic/Server/Properties/launchSettings.json | 2 +- logic/Server/RpcServices.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/logic/Server/Properties/launchSettings.json b/logic/Server/Properties/launchSettings.json index 6d2873f..308724a 100644 --- a/logic/Server/Properties/launchSettings.json +++ b/logic/Server/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "Server": { "commandName": "Project", - "commandLineArgs": "--port 8888 --studentCount 4 --trickerCount 1 --resultFileName result --gameTimeInSecond 1 --fileName video" + "commandLineArgs": "--port 8888 --studentCount 4 --trickerCount 1 --resultFileName result --gameTimeInSecond 551 --fileName video" } } } \ No newline at end of file diff --git a/logic/Server/RpcServices.cs b/logic/Server/RpcServices.cs index cac7984..1507269 100644 --- a/logic/Server/RpcServices.cs +++ b/logic/Server/RpcServices.cs @@ -136,7 +136,7 @@ namespace Server var temp = (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1)); bool start = false; Console.WriteLine($"Id: {request.PlayerId} joins."); - // lock (semaDictLock) + lock (spetatorJoinLock) // 为了保证绝对安全,还是加上这个锁吧 { if (semaDict.TryAdd(request.PlayerId, temp)) { From 34638fd8a666550f51933241e6071213f335bee7 Mon Sep 17 00:00:00 2001 From: Timothy Liu Date: Fri, 28 Apr 2023 01:35:54 +0800 Subject: [PATCH 06/29] chore(icon): add enlarged icons --- resource/eesast_software_trans_enlarged.png | Bin 0 -> 115422 bytes .../eesast_software_trans_enlarged_256x256.png | Bin 0 -> 13456 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resource/eesast_software_trans_enlarged.png create mode 100644 resource/eesast_software_trans_enlarged_256x256.png diff --git a/resource/eesast_software_trans_enlarged.png b/resource/eesast_software_trans_enlarged.png new file mode 100644 index 0000000000000000000000000000000000000000..088700cce6ab3663866889b3e8da450f2b91c88d GIT binary patch literal 115422 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%0D3o9KkM1cf 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 z

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