diff --git a/logic/Client/CommandLineArgs.cs b/logic/Client/CommandLineArgs.cs index fe08801..c79edd2 100644 --- a/logic/Client/CommandLineArgs.cs +++ b/logic/Client/CommandLineArgs.cs @@ -36,7 +36,7 @@ namespace Client public string PlaybackFile { get; set; } = DefaultArgumentOptions.FileName; [Option("playbackSpeed", Required = false, HelpText = "The speed of the playback, between 0.25 and 4.0")] - public double PlaybackSpeed { get; set; } = 1.0; + public double PlaybackSpeed { get; set; } = 2.0; } } diff --git a/logic/Client/MainWindow.xaml.cs b/logic/Client/MainWindow.xaml.cs index 073eabc..0768a1f 100644 --- a/logic/Client/MainWindow.xaml.cs +++ b/logic/Client/MainWindow.xaml.cs @@ -413,19 +413,6 @@ namespace Client { human = obj.StudentMessage; } - if (obj.StudentMessage.PlayerId < GameData.numOfStudent) - { - IStudentType occupation = (IStudentType)OccupationFactory.FindIOccupation(Transformation.ToStudentType(obj.StudentMessage.StudentType)); - totalLife[obj.StudentMessage.PlayerId] = occupation.MaxHp; - totalDeath[obj.StudentMessage.PlayerId] = occupation.MaxGamingAddiction; - int i = 0; - foreach (var skill in occupation.ListOfIActiveSkill) - { - var iActiveSkill = SkillFactory.FindIActiveSkill(skill); - coolTime[i, obj.StudentMessage.PlayerId] = iActiveSkill.SkillCD; - ++i; - } - } listOfHuman.Add(obj.StudentMessage); break; case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: @@ -433,14 +420,6 @@ namespace Client { butcher = obj.TrickerMessage; } - IGhostType occupation1 = (IGhostType)OccupationFactory.FindIOccupation(Transformation.ToTrickerType(obj.TrickerMessage.TrickerType)); - int j = 0; - foreach (var skill in occupation1.ListOfIActiveSkill) - { - var iActiveSkill = SkillFactory.FindIActiveSkill(skill); - coolTime[j, GameData.numOfStudent] = iActiveSkill.SkillCD; - ++j; - } listOfButcher.Add(obj.TrickerMessage); break; case MessageOfObj.MessageOfObjOneofCase.PropMessage: @@ -519,6 +498,7 @@ namespace Client listOfAll.Add(content.AllMessage); break; case GameState.GameEnd: + MessageBox.Show("Game Over!"); foreach (var obj in content.ObjMessage) { switch (obj.MessageOfObjCase) @@ -667,53 +647,81 @@ namespace Client private void Refresh(object? sender, EventArgs e) //log未更新 { - // Bonus(); - if (WindowState == WindowState.Maximized) - MaxButton.Content = "❐"; - else - MaxButton.Content = "🗖"; - if (StatusBarsOfSurvivor != null) + lock (drawPicLock) // 加锁是必要的,画图操作和接收信息操作不能同时进行 { - for (int i = 0; i < GameData.numOfStudent; i++) + // Bonus(); + if (WindowState == WindowState.Maximized) + MaxButton.Content = "❐"; + else + MaxButton.Content = "🗖"; + foreach (var obj in listOfHuman) { - StatusBarsOfSurvivor[i].SetFontSize(12 * UpperLayerOfMap.ActualHeight / 650); - StatusBarsOfSurvivor[i].NewData(totalLife, totalDeath, coolTime); + if (obj.PlayerId < GameData.numOfStudent) + { + IStudentType occupation = (IStudentType)OccupationFactory.FindIOccupation(Transformation.ToStudentType(obj.StudentType)); + totalLife[obj.PlayerId] = occupation.MaxHp; + totalDeath[obj.PlayerId] = occupation.MaxGamingAddiction; + int i = 0; + foreach (var skill in occupation.ListOfIActiveSkill) + { + var iActiveSkill = SkillFactory.FindIActiveSkill(skill); + coolTime[i, obj.PlayerId] = iActiveSkill.SkillCD; + ++i; + } + } } - } - if (StatusBarsOfHunter != null) - { - StatusBarsOfHunter.SetFontSize(12 * UpperLayerOfMap.ActualHeight / 650); - StatusBarsOfHunter.NewData(totalLife, totalDeath, coolTime); - } - if (StatusBarsOfCircumstance != null) - StatusBarsOfCircumstance.SetFontSize(12 * UpperLayerOfMap.ActualHeight / 650); - // 完成窗口信息更新 - if (!isClientStocked) - { - unit = Math.Sqrt(UpperLayerOfMap.ActualHeight * UpperLayerOfMap.ActualWidth) / 50; - unitHeight = UpperLayerOfMap.ActualHeight / 50; - unitWidth = UpperLayerOfMap.ActualWidth / 50; - try + foreach (var obj in listOfButcher) { - // 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 - //{ - lock (drawPicLock) // 加锁是必要的,画图操作和接收信息操作不能同时进行 + 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; + } + } + 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 (!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); @@ -978,17 +986,18 @@ namespace Client } //} ZoomMap(); + + } + catch (Exception exc) + { + ErrorDisplayer error = new("Error: " + exc.ToString()); + error.Show(); + isClientStocked = true; + PorC.Content = "▶"; } } - catch (Exception exc) - { - ErrorDisplayer error = new("Error: " + exc.ToString()); - error.Show(); - isClientStocked = true; - PorC.Content = "▶"; - } + counter++; } - counter++; } // 键盘控制,未完善 @@ -1210,10 +1219,18 @@ namespace Client isClientStocked = true; PorC.Content = "▶"; } - else + else if (!isPlaybackMode) { - isClientStocked = false; - PorC.Content = "⏸"; + try + { + isClientStocked = false; + PorC.Content = "⏸"; + } + catch (Exception ex) + { + ErrorDisplayer error = new("发生错误。以下是系统报告:\n" + ex.ToString()); + error.Show(); + } } } // 未复现 @@ -1341,6 +1358,7 @@ namespace Client private List listOfGate; private List listOfHiddenGate; private object drawPicLock = new object(); + private object recvLock = new object(); private MessageOfStudent? human = null; private MessageOfTricker? butcher = null; private bool humanOrButcher;//true for human @@ -1407,6 +1425,7 @@ namespace Client bool isSpectatorMode = false; bool isEmergencyOpened = false; bool isEmergencyDrawed = false; + bool isDataFixed = false; const double radiusTimes = 1.0 * Preparation.Utility.GameData.characterRadius / Preparation.Utility.GameData.numOfPosGridPerCell; private int[] totalLife = new int[4] { 100, 100, 100, 100 }, totalDeath = new int[4] { 100, 100, 100, 100 }; private int[,] coolTime = new int[3, 5] { { 100, 100, 100, 100, 100 }, { 100, 100, 100, 100, 100 }, { 100, 100, 100, 100, 100 } }; diff --git a/logic/Client/PlaybackClient.cs b/logic/Client/PlaybackClient.cs index af923ca..5290b37 100644 --- a/logic/Client/PlaybackClient.cs +++ b/logic/Client/PlaybackClient.cs @@ -7,6 +7,7 @@ using Protobuf; using Playback; using System.Threading; using Timothy.FrameRateTask; +using System.Windows; namespace Client { @@ -79,183 +80,194 @@ namespace Client } } }; - new Thread(() => { - new FrameRateTaskExecutor - ( - () => !endFile, - () => - { - var content = Reader.ReadOne(); - if (content == null) - endFile = true; - else + int i = 0; + try + { + new FrameRateTaskExecutor + ( + () => !endFile, + () => { - lock (dataLock) + var content = Reader.ReadOne(); + i++; + if (content == null) + { + MessageBox.Show($"End! {i}"); + endFile = true; + } + else { - listOfHuman.Clear(); - listOfButcher.Clear(); - listOfProp.Clear(); - listOfBombedBullet.Clear(); - listOfBullet.Clear(); - listOfAll.Clear(); - listOfChest.Clear(); - listOfClassroom.Clear(); - listOfDoor.Clear(); - listOfHiddenGate.Clear(); - listOfGate.Clear(); - switch (content.GameState) + lock (dataLock) { - case GameState.GameStart: - foreach (var obj in content.ObjMessage) - { - switch (obj.MessageOfObjCase) + listOfHuman.Clear(); + listOfButcher.Clear(); + listOfProp.Clear(); + listOfBombedBullet.Clear(); + listOfBullet.Clear(); + listOfAll.Clear(); + listOfChest.Clear(); + listOfClassroom.Clear(); + listOfDoor.Clear(); + listOfHiddenGate.Clear(); + listOfGate.Clear(); + switch (content.GameState) + { + case GameState.GameStart: + foreach (var obj in content.ObjMessage) { - case MessageOfObj.MessageOfObjOneofCase.StudentMessage: - //if (humanOrButcher && obj.StudentMessage.PlayerId == playerID) - //{ - // human = obj.StudentMessage; - //} - listOfHuman.Add(obj.StudentMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: - //if (!humanOrButcher && obj.TrickerMessage.PlayerId == playerID) - //{ - // butcher = obj.TrickerMessage; - //} - listOfButcher.Add(obj.TrickerMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.PropMessage: - listOfProp.Add(obj.PropMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: - listOfBombedBullet.Add(obj.BombedBulletMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.BulletMessage: - listOfBullet.Add(obj.BulletMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.ChestMessage: - listOfChest.Add(obj.ChestMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.ClassroomMessage: - listOfClassroom.Add(obj.ClassroomMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.DoorMessage: - listOfDoor.Add(obj.DoorMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.GateMessage: - listOfGate.Add(obj.GateMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.HiddenGateMessage: - listOfHiddenGate.Add(obj.HiddenGateMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.MapMessage: - break; + switch (obj.MessageOfObjCase) + { + case MessageOfObj.MessageOfObjOneofCase.StudentMessage: + //if (humanOrButcher && obj.StudentMessage.PlayerId == playerID) + //{ + // human = obj.StudentMessage; + //} + listOfHuman.Add(obj.StudentMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: + //if (!humanOrButcher && obj.TrickerMessage.PlayerId == playerID) + //{ + // butcher = obj.TrickerMessage; + //} + listOfButcher.Add(obj.TrickerMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.PropMessage: + listOfProp.Add(obj.PropMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: + listOfBombedBullet.Add(obj.BombedBulletMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.BulletMessage: + listOfBullet.Add(obj.BulletMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.ChestMessage: + listOfChest.Add(obj.ChestMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.ClassroomMessage: + listOfClassroom.Add(obj.ClassroomMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.DoorMessage: + listOfDoor.Add(obj.DoorMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.GateMessage: + listOfGate.Add(obj.GateMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.HiddenGateMessage: + listOfHiddenGate.Add(obj.HiddenGateMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.MapMessage: + break; + } } - } - listOfAll.Add(content.AllMessage); - break; - case GameState.GameRunning: - foreach (var obj in content.ObjMessage) - { - switch (obj.MessageOfObjCase) + listOfAll.Add(content.AllMessage); + break; + case GameState.GameRunning: + foreach (var obj in content.ObjMessage) { - case MessageOfObj.MessageOfObjOneofCase.StudentMessage: - //if (humanOrButcher && obj.StudentMessage.PlayerId == playerID) - //{ - // human = obj.StudentMessage; - //} - listOfHuman.Add(obj.StudentMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: - //if (!humanOrButcher && obj.TrickerMessage.PlayerId == playerID) - //{ - // butcher = obj.TrickerMessage; - //} - listOfButcher.Add(obj.TrickerMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.PropMessage: - listOfProp.Add(obj.PropMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: - listOfBombedBullet.Add(obj.BombedBulletMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.BulletMessage: - listOfBullet.Add(obj.BulletMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.ChestMessage: - listOfChest.Add(obj.ChestMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.ClassroomMessage: - listOfClassroom.Add(obj.ClassroomMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.DoorMessage: - listOfDoor.Add(obj.DoorMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.HiddenGateMessage: - listOfHiddenGate.Add(obj.HiddenGateMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.GateMessage: - listOfGate.Add(obj.GateMessage); - break; + switch (obj.MessageOfObjCase) + { + case MessageOfObj.MessageOfObjOneofCase.StudentMessage: + //if (humanOrButcher && obj.StudentMessage.PlayerId == playerID) + //{ + // human = obj.StudentMessage; + //} + listOfHuman.Add(obj.StudentMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: + //if (!humanOrButcher && obj.TrickerMessage.PlayerId == playerID) + //{ + // butcher = obj.TrickerMessage; + //} + listOfButcher.Add(obj.TrickerMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.PropMessage: + listOfProp.Add(obj.PropMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: + listOfBombedBullet.Add(obj.BombedBulletMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.BulletMessage: + listOfBullet.Add(obj.BulletMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.ChestMessage: + listOfChest.Add(obj.ChestMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.ClassroomMessage: + listOfClassroom.Add(obj.ClassroomMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.DoorMessage: + listOfDoor.Add(obj.DoorMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.HiddenGateMessage: + listOfHiddenGate.Add(obj.HiddenGateMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.GateMessage: + listOfGate.Add(obj.GateMessage); + break; + } } - } - listOfAll.Add(content.AllMessage); - break; + listOfAll.Add(content.AllMessage); + break; - case GameState.GameEnd: - foreach (var obj in content.ObjMessage) - { - switch (obj.MessageOfObjCase) + case GameState.GameEnd: + MessageBox.Show("Game Over!"); + foreach (var obj in content.ObjMessage) { - case MessageOfObj.MessageOfObjOneofCase.StudentMessage: - listOfHuman.Add(obj.StudentMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: - listOfButcher.Add(obj.TrickerMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.PropMessage: - listOfProp.Add(obj.PropMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: - listOfBombedBullet.Add(obj.BombedBulletMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.BulletMessage: - listOfBullet.Add(obj.BulletMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.ChestMessage: - listOfChest.Add(obj.ChestMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.ClassroomMessage: - listOfClassroom.Add(obj.ClassroomMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.DoorMessage: - listOfDoor.Add(obj.DoorMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.HiddenGateMessage: - listOfHiddenGate.Add(obj.HiddenGateMessage); - break; - case MessageOfObj.MessageOfObjOneofCase.GateMessage: - listOfGate.Add(obj.GateMessage); - break; + switch (obj.MessageOfObjCase) + { + case MessageOfObj.MessageOfObjOneofCase.StudentMessage: + listOfHuman.Add(obj.StudentMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: + listOfButcher.Add(obj.TrickerMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.PropMessage: + listOfProp.Add(obj.PropMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: + listOfBombedBullet.Add(obj.BombedBulletMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.BulletMessage: + listOfBullet.Add(obj.BulletMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.ChestMessage: + listOfChest.Add(obj.ChestMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.ClassroomMessage: + listOfClassroom.Add(obj.ClassroomMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.DoorMessage: + listOfDoor.Add(obj.DoorMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.HiddenGateMessage: + listOfHiddenGate.Add(obj.HiddenGateMessage); + break; + case MessageOfObj.MessageOfObjOneofCase.GateMessage: + listOfGate.Add(obj.GateMessage); + break; + } } - } - listOfAll.Add(content.AllMessage); - break; + listOfAll.Add(content.AllMessage); + break; + } } } - } - }, - frame, - () => + }, + frame, + () => + { + Sema.Release(); + return 1; + } + ) + { AllowTimeExceed = true }.Start(); + } + catch (Exception ex) { - Sema.Release(); - //MessageBox.Show("Game Over!"); - return 1; + MessageBox.Show(ex.Message); } - ) - { AllowTimeExceed = true }.Start(); }) { IsBackground = true }.Start(); return map; diff --git a/logic/Client/Properties/launchSettings.json b/logic/Client/Properties/launchSettings.json index 5e50d0d..fb94197 100644 --- a/logic/Client/Properties/launchSettings.json +++ b/logic/Client/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "Client": { "commandName": "Project", - "commandLineArgs": "--ip 127.0.0.1 --cl --port 8888 --characterID 4 --type 2 --occupation 2" + "commandLineArgs": "--cl --playbackFile D:\\2_autumn\\thuai6\\THUAI6\\logic\\cmd\\test.thuaipb --playbackSpeed 2 " } } } \ No newline at end of file diff --git a/logic/Client/StatusBarOfCircumstance.xaml.cs b/logic/Client/StatusBarOfCircumstance.xaml.cs index 9e51039..5d4616c 100644 --- a/logic/Client/StatusBarOfCircumstance.xaml.cs +++ b/logic/Client/StatusBarOfCircumstance.xaml.cs @@ -31,10 +31,13 @@ namespace Client } public void SetFontSize(double fontsize) { - status.FontSize = 13 * fontsize / 12; - time.FontSize = 14 * fontsize / 12; - name.FontSize = 14 * fontsize / 12; - scoresOfStudents.FontSize = scoresOfTrickers.FontSize = fontsize; + if (fontsize != 0) + { + status.FontSize = 13 * fontsize / 12; + time.FontSize = 14 * fontsize / 12; + name.FontSize = 14 * fontsize / 12; + scoresOfStudents.FontSize = scoresOfTrickers.FontSize = fontsize; + } } public void SetValue(MessageOfAll obj, bool gateOpened, bool hiddenGateRefreshed, bool hiddenGateOpened, long playerId) diff --git a/logic/Client/StatusBarOfHunter.xaml.cs b/logic/Client/StatusBarOfHunter.xaml.cs index b9b3fb9..b4c4add 100644 --- a/logic/Client/StatusBarOfHunter.xaml.cs +++ b/logic/Client/StatusBarOfHunter.xaml.cs @@ -32,7 +32,8 @@ namespace Client } public void SetFontSize(double fontsize) { - serial.FontSize = scores.FontSize = state.FontSize = status.FontSize = activeSkill0.FontSize = activeSkill1.FontSize = activeSkill2.FontSize = prop0.FontSize = prop1.FontSize = prop2.FontSize = fontsize; + if (fontsize != 0) + serial.FontSize = scores.FontSize = state.FontSize = status.FontSize = activeSkill0.FontSize = activeSkill1.FontSize = activeSkill2.FontSize = prop0.FontSize = prop1.FontSize = prop2.FontSize = fontsize; } private void SetStaticValue(MessageOfTricker obj) diff --git a/logic/Client/StatusBarOfSurvivor.xaml.cs b/logic/Client/StatusBarOfSurvivor.xaml.cs index 5304479..fa7ca3e 100644 --- a/logic/Client/StatusBarOfSurvivor.xaml.cs +++ b/logic/Client/StatusBarOfSurvivor.xaml.cs @@ -31,7 +31,8 @@ namespace Client } public void SetFontSize(double fontsize) { - serial.FontSize = scores.FontSize = status.FontSize = activeSkill0.FontSize = activeSkill1.FontSize = activeSkill2.FontSize = prop0.FontSize = prop1.FontSize = prop2.FontSize = fontsize; + if (fontsize != 0) + serial.FontSize = scores.FontSize = status.FontSize = activeSkill0.FontSize = activeSkill1.FontSize = activeSkill2.FontSize = prop0.FontSize = prop1.FontSize = prop2.FontSize = fontsize; } private void SetStaticValue(MessageOfStudent obj) { diff --git a/logic/Server/GameServer.cs b/logic/Server/GameServer.cs index 5ecc5f7..2a80249 100644 --- a/logic/Server/GameServer.cs +++ b/logic/Server/GameServer.cs @@ -130,7 +130,7 @@ namespace Server case GameState.GameRunning: case GameState.GameEnd: case GameState.GameStart: - currentGameInfo.ObjMessage.Add(currentMapMsg); + if (gameState == GameState.GameStart) currentGameInfo.ObjMessage.Add(currentMapMsg); foreach (GameObj gameObj in gameObjList) { MessageOfObj? msg = CopyInfo.Auto(gameObj); @@ -153,7 +153,6 @@ namespace Server break; } } - foreach (var kvp in semaDict) { kvp.Value.Item1.Release(); diff --git a/logic/cmd/gameServer.cmd b/logic/cmd/gameServer.cmd index d4d54f2..f91b10b 100644 --- a/logic/cmd/gameServer.cmd +++ b/logic/cmd/gameServer.cmd @@ -1,6 +1,6 @@ @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 +start cmd /k ..\Server\bin\Debug\net6.0\Server.exe --ip 0.0.0.0 --port 8888 --studentCount 4 --trickerCount 1 --gameTimeInSecond 60 --fileName test ping -n 2 127.0.0.1 > NUL @@ -12,4 +12,6 @@ start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --ch start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --characterID 2 --type 1 --occupation 3 -start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --characterID 3 --type 1 --occupation 3 \ No newline at end of file +start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --characterID 3 --type 1 --occupation 3 + +::start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --ip 0.0.0.0 --port 8888 --characterID 2030 diff --git a/logic/cmd/playback.cmd b/logic/cmd/playback.cmd index 8bb70ea..32156c7 100644 --- a/logic/cmd/playback.cmd +++ b/logic/cmd/playback.cmd @@ -1,5 +1,5 @@ @echo off -start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --playbackFile .\test.thuaipb --playbackSpeed 3 +start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --playbackFile .\test.thuaipb --playbackSpeed 1 ping -n 2 127.0.0.1 > NUL \ No newline at end of file diff --git a/playback/Playback/MessageReader.cs b/playback/Playback/MessageReader.cs index e9c24b2..71f6616 100644 --- a/playback/Playback/MessageReader.cs +++ b/playback/Playback/MessageReader.cs @@ -27,7 +27,7 @@ namespace Playback public readonly uint teamCount; public readonly uint playerCount; - const int bufferMaxSize = 1024 * 1024; // 1M + const int bufferMaxSize = 10 * 1024 * 1024; // 10M public MessageReader(string fileName) { @@ -83,7 +83,8 @@ namespace Playback public MessageToClient? ReadOne() { beginRead: - if (Finished) return null; + if (Finished) + return null; var pos = cos.Position; try { @@ -94,9 +95,21 @@ namespace Playback catch (InvalidProtocolBufferException) { var leftByte = buffer.Length - pos; // 上次读取剩余的字节 - for (int i = 0; i < leftByte; ++i) + if (buffer.Length < bufferMaxSize / 2) { - buffer[i] = buffer[pos + i]; + var newBuffer = new byte[bufferMaxSize]; + for (int i = 0; i < leftByte; i++) + { + newBuffer[i] = buffer[pos + i]; + } + buffer = newBuffer; + } + else + { + for (int i = 0; i < leftByte; ++i) + { + buffer[i] = buffer[pos + i]; + } } var bufferSize = gzs.Read(buffer, (int)leftByte, (int)(buffer.Length - leftByte)) + leftByte; if (bufferSize == leftByte) diff --git a/playback/Playback/MessageWriter.cs b/playback/Playback/MessageWriter.cs index a23d701..abda3c2 100644 --- a/playback/Playback/MessageWriter.cs +++ b/playback/Playback/MessageWriter.cs @@ -12,7 +12,7 @@ namespace Playback private CodedOutputStream cos; private MemoryStream ms; private GZipStream gzs; - private const int memoryCapacity = 1024 * 1024; // 1M + private const int memoryCapacity = 10 * 1024 * 1024; // 10M private static void ClearMemoryStream(MemoryStream msToClear) {